如何从TabHost引用子活动来调用公共函数?

时间:2011-03-22 23:53:52

标签: android android-activity android-tabhost

我有一个带有两个子活动的TabHost(在两个标签中)。我还在其中一个活动中实现了一个公共函数,我想从我的父母(TabHost)调用,以触发选项卡中的某些操作。

是否可以从TabHost引用活动本身来调用公共函数?

由于

这是我的tabhost设置:

    res = getResources(); 
    tabHost = getTabHost(); 

    TabHost.TabSpec spec; 
    Intent intent;  

    intent = new Intent().setClass(this, home.class);
    spec = tabHost.newTabSpec("home").setIndicator("Groups", res.getDrawable(R.drawable.groups)).setContent(intent);
    tabHost.addTab(spec);
    intent = new Intent().setClass(this, messages.class);
    spec = tabHost.newTabSpec("messages").setIndicator("Messages", res.getDrawable(R.drawable.messages)).setContent(intent);    
    tabHost.addTab(spec);

6 个答案:

答案 0 :(得分:22)

我的方法是在扩展BroadcastReceiver的子活动中定义一个嵌套的“监听器”类。

然后我会从我的TabActivity广播一个Intent,然后触发BroadcastReceiver来执行操作。

编辑:提供示例代码...

步骤是......

  1. 在清单
  2. 中定义intent过滤器
  3. 将嵌套的“侦听器”添加到子活动
  4. 在子活动中设置onResume()/ onPause()以注册/取消注册监听器
  5. 在TabActivity中创建意图并在您希望孩子做某事时广播
  6. 在AndroidManifest.xml中

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

    在MyActivity.java中

    public class MyActivity extends Activity {
    
        private MyListener listener = null;
        private Boolean MyListenerIsRegistered = false;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreated(savedInstanceState);
    
            listener = new MyListener();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
            if (!MyListenerIsRegistered) {
                registerReceiver(listener, new IntentFilter("com.mycompany.myApp.DO_SOMETHING"));
                MyListenerIsRegisterd = true;
            }
        }
    
        @Override
        protected void onPause() {
            super.onPause();
    
            if (MyListenerIsRegistered) {
                unregisterReceiver(listener);
                MyListenerIsRegistered = false;
            }
        }
    
        // Nested 'listener'
        protected class MyListener extends BroadcastReceiver {
    
            @Override
            public void onReceive(Context context, Intent intent) {
    
                // No need to check for the action unless the listener will
                // will handle more than one - let's do it anyway
                if (intent.getAction().equals("com.mycompany.myApp.DO_SOMETHING")) {
                    // Do something
                }
            }
        }
    }
    

    主要TabActivity

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

答案 1 :(得分:16)

我找到了另一种可能更简单的解决方案。我相信OP不再需要这个了,但也许未来的某个人会很高兴找到它。

所以,基本上,要在您的子活动中运行公共方法,您只需要在父级中使用这一小段代码(tabHosthomemessage取自OP的TabHost配置):

tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
    @Override
    public void onTabChanged(String tabId) {
        Activity currentActivity = getCurrentActivity();
        if (currentActivity instanceof home) {
            ((home) currentActivity).aPublicMethodFromClassHome();
        }
        if (currentActivity instanceof messages) { 
            ((messages) currentActivity).aPublicMethodFromClassMessages();
        }
    }
});

我在我的应用程序中使用它。充当魅力;)

答案 2 :(得分:6)

我正在调试Android应用程序并遇到了同样的需求。我通过以下代码片段找到了一个非常直截了当的答案:

String currentActivityId = getLocalActivityManager().getCurrentId();
Activity currentActivity = getLocalActivityManager().getActivity(currentActivityId);

此处的标识符是创建TabSpec时给出的标识符:

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

答案 3 :(得分:4)

谢谢,这帮我解决了类似的问题!

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

答案 4 :(得分:1)

通过此链接,我找到了这个简单的解决方案(http://androidactivity.wordpress.com/2012/08/17/two-way-communication-between-tabactivity-and-its-child-tabs/):

嗯,诀窍是存储与每个标签相关联的标签,并使用它来调用相应的活动。

创建选项卡时,将其与以下标记相关联:

yourTabHost.newTabSpec("Tab1");

假设我们想要调用Tab1 Activity中的方法“refreshContent()”。

从MainActivity调用这些行很简单:

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

就是这样!

现在反方向,我们想从子选项卡TabActivity1中调用MainActivity中的一些方法“updateMain()”。

在TabActivity1,您只需要致电

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

答案 5 :(得分:0)

发现它很简单,在应用程序ActivityTab类中使用它:

if(getCurrentActivity() instanceof YourSearchActivity){
            log("onClick: instance found");
            ((YourSearchActivity)getCurrentActivity()).activityPublicFuntion();
        }