我有一个带有两个子活动的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);
答案 0 :(得分:22)
我的方法是在扩展BroadcastReceiver的子活动中定义一个嵌套的“监听器”类。
然后我会从我的TabActivity广播一个Intent,然后触发BroadcastReceiver来执行操作。
编辑:提供示例代码...
步骤是......
在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不再需要这个了,但也许未来的某个人会很高兴找到它。
所以,基本上,要在您的子活动中运行公共方法,您只需要在父级中使用这一小段代码(tabHost
,home
和message
取自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();
}