Skip to content Skip to sidebar Skip to footer

How To Reference Child Activity From Tabhost To Call A Public Function?

I have a TabHost with two child activities in it (in two tabs). I also implemented a public function in one of these activities that i would like to call from my parent (TabHost),

Solution 1:

My approach would be to define a nested 'listener' class in the child activity which extends BroadcastReceiver.

I would then simply broadcast an Intent from my TabActivity which would then trigger the BroadcastReceiver to perform the action.

EDIT: To give example code...

The steps are...

  1. Define the intent filter in the manifest
  2. Add the nested 'listener' to the child activity
  3. Set onResume()/onPause() in child activity to register/unregister the listener
  4. Create intent in TabActivity and broadcast it when you want child to do something

In AndroidManifest.xml

<activityandroid:name=".MyActivity"android:label="@string/app_name"
    <intent-filter><actionandroid:name="com.mycompany.myApp.DO_SOMETHING" /></intent-filter></activity>

In MyActivity.java

publicclassMyActivityextendsActivity {

    privateMyListener listener = null;
    privateBooleanMyListenerIsRegistered = false;

    @OverridepublicvoidonCreate(Bundle savedInstanceState) {
        super.onCreated(savedInstanceState);

        listener = newMyListener();
    }

    @OverrideprotectedvoidonResume() {
        super.onResume();

        if (!MyListenerIsRegistered) {
            registerReceiver(listener, newIntentFilter("com.mycompany.myApp.DO_SOMETHING"));
            MyListenerIsRegisterd = true;
        }
    }

    @OverrideprotectedvoidonPause() {
        super.onPause();

        if (MyListenerIsRegistered) {
            unregisterReceiver(listener);
            MyListenerIsRegistered = false;
        }
    }

    // Nested 'listener'protectedclassMyListenerextendsBroadcastReceiver {

        @OverridepublicvoidonReceive(Context context, Intent intent) {

            // No need to check for the action unless the listener will// will handle more than one - let's do it anywayif (intent.getAction().equals("com.mycompany.myApp.DO_SOMETHING")) {
                // Do something
            }
        }
    }
}

In the main TabActivity

privatevoidMakeChildDoSomething() {

    Intent i = new Intent();
    i.setAction("com.mycompany.myApp.DO_SOMETHING");
    sendBroadcast(i);
}

Solution 2:

I've found another, probably simpler solution. I'm sure OP doesn't need this any more, but maybe someone from the future will be glad to find it.

So, basically, to run a public method in your child activity, you just need this little piece of code in your parent (tabHost, home and message are taken from OP's TabHost configuration):

tabHost.setOnTabChangedListener(newTabHost.OnTabChangeListener() {
    @OverridepublicvoidonTabChanged(String tabId) {
        Activity currentActivity = getCurrentActivity();
        if (currentActivity instanceof home) {
            ((home) currentActivity).aPublicMethodFromClassHome();
        }
        if (currentActivity instanceof messages) { 
            ((messages) currentActivity).aPublicMethodFromClassMessages();
        }
    }
});

I use it in my application. Works as a charm;)

Solution 3:

I'm currently debugging an Android application and came across the same need. I found a much straightforward answer to this with this code snippet :

StringcurrentActivityId= getLocalActivityManager().getCurrentId();
ActivitycurrentActivity= getLocalActivityManager().getActivity(currentActivityId);

The identifier here is the identifier given when creating the TabSpec :

tabHost.newTabSpec("id").setIndicator(indicator).setContent(intent);

Solution 4:

Thank you, this helped me to solve a simular problem!

ActivitycurrentActivity= getLocalActivityManager().getActivity(_TabHost.getCurrentTabTag());
if(currentActivity != null && currentActivity instanceof iMyActivity)
{
// pass to children
((iMyActivity)currentActivity).onLaunchDelegate();
}

Solution 5:

From this link, I found this simple solution (http://androidactivity.wordpress.com/2012/08/17/two-way-communication-between-tabactivity-and-its-child-tabs/):

Well, the trick is to store the TAG associated with each tab, and use it to call the respective activity.

When you create the tab, you associate it with a tag like following:

yourTabHost.newTabSpec("Tab1");

Lets say we want to invoke a method “refreshContent()” that is inside the Tab1 Activity.

It’s simple as calling these lines from the MainActivity:

ActivityTab1activity= (ActivityTab1) getLocalActivityManager().getActivity("Tab1");
 activity.refreshContent();

And that’s it!

Now for the opposite direction, we want to call some method “updateMain()” inside MainActivity, from the child tab TabActivity1.

At the TabActivity1 you will only need to call

((MainActivity)getParent()).updateMain();

Post a Comment for "How To Reference Child Activity From Tabhost To Call A Public Function?"