Android - 在选项卡中的“活动”中切换选项卡

时间:2010-03-29 22:52:30

标签: android tabs android-intent

目前我有一个TabHost实现了3个标签,每个标签包含一个单独的活动。我的问题是如何在选项卡主机内的一个活动中切换选项卡。我到处寻找并找不到解决这个问题的真正答案。

7 个答案:

答案 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项目herehere

作为旁注,在决定是否使用基于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教程并从那里开始工作)