目前我有一个TabHost实现了3个标签,每个标签包含一个单独的活动。我的问题是如何在选项卡主机内的一个活动中切换选项卡。我到处寻找并找不到解决这个问题的真正答案。
答案 0 :(得分:94)
经过长时间的努力解决这个问题后,我已经找到了在使用基于活动的标签时切换标签的解决方案。
在创建tabhost的父活动类中,我实现了如下所示的方法:
public void switchTab(int tab){
tabHost.setCurrentTab(tab);
}
在我希望能够在内部切换到另一个标签的标签内,我创建了以下方法:
public void switchTabInActivity(int indexTabToSwitchTo){
MintTrack parentActivity;
parentActivity = (MintTrack) this.getParent();
parentActivity.switchTab(indexTabToSwitchTo);
}
如果您想了解此代码的一个很好的示例,可以查看我的MintTrack项目here和here。
作为旁注,在决定是否使用基于TabHost的视图或活动时请务必小心。
基于 Activity
的选项卡很棒,因为它们可以分成自己的XML文件。活动也可以组织到自己的Java文件中,而不是混杂在一起。可以说,你会想到的一些事情很容易变得复杂,基于活动的标签。很难在标签之间传递信息而不会产生开销。基于Activity
的选项卡也会占用更多的内存/ CPU时间,因为它们每个都有Activity
的开销。在深入使用Activity
TabHost
之前,请考虑这个以及更多的权衡。我现在知道,如果我再次使用它,我会亲自使用基于TabHost
的视图。
答案 1 :(得分:10)
我遇到了同样的问题。虽然所有标签的单个活动会更好,但有时采取简单的方法是合理的选择。
为了避免在标签想要更改为其他标签时创建新的标签活动,我将其放在AndroidManifest.xml中:
<activity android:name=".MyTabsActivity"
android:label="Tabs!"
android:launchMode="singleTask">
使用您想要的标签发送意图:
class OneTabContentActivity {
void switchTab() {
final Intent intent = new Intent(mContext, MyTabsActivity.class);
intent.setAction("Switch to tab 1, please");
mContext.startActivity(intent);
}
class MyTabsActivity {
@Override
protected void onNewIntent (Intent intent) {
super.onNewIntent(intent);
getTabHost().setCurrentTab(1);
}
}
这个解决方案有缺点,但我不清楚细节。其他人可能已经足够了解它们。
答案 2 :(得分:6)
首先,我将一个方法设置为我的主类,它扩展了TabActivity,让它称之为“MainActivity”
public TabHost getMyTabHost() { return tabHost; }
然后,我添加了tab活动类;
MainActivity ta = (MainActivity) this.getParent();
TabHost th = ta.getMyTabHost();
th.setCurrentTab(0);
它对我有用。
答案 3 :(得分:5)
步骤1:在setContent()
TabSpec
形式,将标签保持活动替换为标签保持视图
第2步:从您的setCurrentTab()
TabHost
致电Activity
我还没有看到将Activity
作为标签内容而非简单View
的任何好处。使用Activity
作为选项卡的内容会浪费CPU时间和内存(以及因此电池寿命),并使您尝试做的事情变得更加困难。
答案 4 :(得分:3)
我有一个稍微不同的问题,并认为我会为面临类似情况的其他人添加此问题。我有一个基于活动的选项卡式应用程序,其中一个选项卡活动启动另一个不受tabHost控制的活动。我需要在此活动完成()上有一个按钮(即:返回主标签视图)并同时切换到另一个标签。
我决定使用BroadcastReceiver处理它。在设置TabHost的类中,我添加了这个类:
class ChangeTabReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "ChangeTabReceiver: received");
TabHost tabHost = getTabHost();
tabHost.setCurrentTab(1);
}
}
..然后定义了变种:
ChangeTabReceiver changeTabReceiver;
IntentFilter changeTabFilter;
..然后添加到onCreate():
changeTabReceiver = new ChangeTabReceiver();
changeTabFilter = new IntentFilter(myApplication.CHANGE_TAB);
registerReceiver(changeTabReceiver, changeTabFilter);
最后在新活动中,当您要关闭该活动并切换标签时,请执行以下操作:
Intent intent = new Intent(myApplication.CHANGE_TAB);
this.sendBroadcast(intent);
this.finish();
当然你可以通过传递标签索引来创建一个切换到各种标签的方法 - 但在我的情况下,这种行为只发生在一个活动中,所以我决定保持简单......
答案 5 :(得分:2)
public void switchTab(int index){
MintTrack ParentActivity;
ParentActivity = (MintTrack) this.getParent();
ParentActivity.getTabHost().setCurrentTab(index);
}
答案 6 :(得分:2)
我刚刚放了public static TabHost tabHost;
在我的TabActivity
。
然后从任何其他标签我可以MyTabActivity.tabHost.setCurrentTab(tabNumber);
对我来说很好(但我希望我从一开始就使用Fragments ..我只是按照Android文档中的Tab教程并从那里开始工作)