Passing a bundled object from TabHost to a tabbed Activity

Schol-R-LEA

New member
Apr 9, 2011
3
0
0
I am developing an app which (at its current stage of development) consists of a login Activity, which leads to a TabActivity containing four tabs, each of which is instantiated as a separate Activity. I need to be able to pass the user information (or at least the user ID) to some but not all of the tabbed Activities. I am able to pass the data from the login screen to the TabActivity (this has been confirmed by stepping through the relevant section of code), but my attempts to use a similar approach to pass a Bundle to the sub-Activities does not actually pass the Bundle to the child Activities. The relevant code for the TabActivity and an example child Activity is as follows:

ParentTabActivity.java:
Code:
package com.allpropestservices.bugpromobile;

import android.app.TabActivity;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.util.Log;
import android.widget.TabHost;


public class ParentTabActivity extends TabActivity {
	public static final String TAG = "ParentTabActivity";
	public Long userId;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
	    super.onCreate(savedInstanceState);
	    setContentView(R.layout.parent);
	    
	    Bundle b = getIntent().getExtras();
	    
	    try {
	    	userId = b.getLong("UserId");
	    }
	    catch (RuntimeException e) {
	    	String err = e.toString() + " in " + TAG + ".onCreate()";
			Log.v(TAG, err);
	    }
	    
	    Resources res = getResources();  // Resource object to get Drawables
	    TabHost tabHost = getTabHost();  // The activity TabHost
	    TabHost.TabSpec spec;            // Reusable TabSpec for each tab
	    Intent intent;                   // Reusable Intent for each tab
	    Bundle userData;
	    
	    
	    // Create an Intent to launch an Activity for the tab (to be reused)
	    intent = new Intent().setClass(this, AnnouncementActivity.class);
	    // prepare a Bundle to pass to each of the sub-activities
	    userData = new Bundle();
    	userData.putLong("UserID", userId);
    	intent.putExtras(userData);
	    // Initialize a TabSpec for each tab and add it to the TabHost
	    spec = tabHost.newTabSpec("Announcements").setIndicator("Announcements",
	    		res.getDrawable(R.drawable.ic_menu_notifications))
	    		.setContent(intent);
	    tabHost.addTab(spec);

	    intent = new Intent().setClass(this, AlertActivity.class);
	    userData = new Bundle();
    	userData.putLong("UserID", userId);
	    intent.putExtras(userData);
	    spec = tabHost.newTabSpec("Alerts").setIndicator("Alerts",
	    		res.getDrawable(R.drawable.ic_menu_inbox)) 
	            .setContent(intent);
	    tabHost.addTab(spec);

	    intent = new Intent().setClass(this, TimeClockActivity.class);
	    userData = new Bundle();
    	userData.putLong("UserID", userId);
	    intent.putExtras(userData);
	    spec = tabHost.newTabSpec("TimeClock").setIndicator("Time Clock",
	    		res.getDrawable(R.drawable.ic_menu_duration)) 
	            .setContent(intent);
	    tabHost.addTab(spec);	    

	    intent = new Intent().setClass(this, ScheduleActivity.class);
	    userData = new Bundle();
    	userData.putLong("UserID", userId);
    	intent.putExtras(userData);
	    spec = tabHost.newTabSpec("Schedule").setIndicator("Schedule",
	    		res.getDrawable(R.drawable.ic_menu_agenda)) 
	            .setContent(intent);
	    tabHost.addTab(spec);		    
	    
	    tabHost.setCurrentTab(0);

	}
}

AlertActivity.java:
Code:
/**
 * 
 */
package com.allpropestservices.bugpromobile;

import java.util.ArrayList;
import java.util.Date;
import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;

/**
 * @author J. Osako
 *
 */
public class AlertActivity extends Activity {
	// For logging and debugging
    private static final String TAG = "AlertActivity";

    private int position = 0;
	private ArrayList<Message> messages;
	private User user = null;

	/**
	 * 
	 */
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.motd);
        
        Bundle b = getIntent().getExtras();
        Long userId = b.getLong("UserId");
        user = new User(this, userId);
        
        messages = Message.getAlertMessages(this, new Date(), 10, user);
        Message msg = messages.get(position);
       
        TextView banner = (TextView) findViewById(R.id.AlertBanner);
        EditText title = (EditText) findViewById(R.id.AlertTitle);
        EditText body = (EditText) findViewById(R.id.AlertText);
        
        banner.setText("Recent Alerts for " + user.getFullName());
        title.setText(msg.getTitle());
        body.setText(msg.getBody());
    }

}

I am not applying any intent filters in the layout file for ParentTabActivity; the layout is:

parent.xml
Code:
<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:padding="5dp">
        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="5dp" />
    </LinearLayout>
</TabHost>

I realize that it may be possible to avoid this issue by re-designing the TabActivity so that it uses Views instead of Activities, but I would prefer to keep the different tabs separated if at all possible.

Is there any way to make this design work, and if so, where am I making my error? Do I need to add an intent filter to either the parent layout or the child layouts? Would switching to a View-based design negatively impact the modularity of the app?

EDIT: Given that I was mistaken as to which forum I should post this to, I am going to move on to the Android forum at DevShed. I will, however, follow up here as well, if anyone should post a suitable reply. I apologize for this error.
 
Last edited:
Ah, my mistake; I was under the impression that Android Central was a developer's site. I should have been more careful about where I posted.

If one of the moderators could either a) move this thread to a suitable forum, or b) delete it, I would be quite grateful.
 
Problem solved; it turned out to be a typographical error ("UserID" rather than "UserId") in the ParentTabActivity. The fact that it was duplicated four times is particularly galling. The mods can close this thread if they choose to.
 

Forum statistics

Threads
956,568
Messages
6,968,859
Members
3,163,567
Latest member
SmoothieP