Android – 切换选项卡内的活动中的选项卡

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

经过了很长时间的这个问题的斗争,我已经能够find一个解决scheme切换选项卡时使用基于活动。

在创buildtabhost的父活动类中,我实现了一个类似下面的方法:

public void switchTab(int tab){ tabHost.setCurrentTab(tab); } 

在我希望能够在内部切换到另一个选项卡的标签内部,我创build了下面的方法:

 public void switchTabInActivity(int indexTabToSwitchTo){ MintTrack parentActivity; parentActivity = (MintTrack) this.getParent(); parentActivity.switchTab(indexTabToSwitchTo); } 

如果你想要这个代码的一个很好的例子,你可以看看我的MintTrack项目在这里和这里 。

作为一个方面说明,请在决定是否使用基于视图或活动的TabHost时非常小心。

基于Activity的选项卡是伟大的,因为它们可以分为自己的XML文件。 活动也可以组织到自己的Java文件中,而不是混乱成一个。 这就是说,你会认为一些容易变得复杂的基于活动的选项卡。 很难在选项卡之间传递信息而不会造成开销。 基于Activity的选项卡也使用更多的内存/ CPU时间,因为它们每个都有Activity的开销。 在考虑使用基于ActivityTabHost之前,请考虑这一点以及更多的权衡。 我现在知道,如果我再次使用它们,我会亲自使用基于视图的TabHost

我遇到了同样的问题。 虽然所有选项卡的单一活动会更好,但有时采取简单的方法是理性的select。

为了避免在选项卡想要更改为另一个选项卡时创build新的选项卡活动,我把它放在我的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); } } 

这个解决scheme有缺点,但我不清楚的细节。 其他人可能知道足够的指出。

首先,我为我的主类设置了一个方法,它扩展了TabActivity,我们称之为“MainActivity”

 public TabHost getMyTabHost() { return tabHost; } 

然后,我添加我的标签活动类;

 MainActivity ta = (MainActivity) this.getParent(); TabHost th = ta.getMyTabHost(); th.setCurrentTab(0); 

它为我工作。

第一步:使用TabSpec上更好的setContent()replacetab-holding-views和tabs-holding-views

第二步:在您的单个Activity调用setCurrentTab()上的setCurrentTab()

我还没有看到让Activity成为选项卡的内容而不是简单的View好处。 有一个Activity作为选项卡的内容浪费CPU时间和内存(因此,电池寿命),使得你想要做更多的困难。

我有一个稍微不同的问题,并认为我会为任何其他面临类似的情况添加此。 我有一个基于活动的选项卡式应用程序,其中一个选项卡活动启动另一个不受tabHost控制的活动。 我需要在这个activity完成()的button(即:返回到主Tab键视图),并同时切换到不同的选项卡。

我决定用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); } } 

然后定义variables:

 ChangeTabReceiver changeTabReceiver; IntentFilter changeTabFilter; 

..然后添加到onCreate():

 changeTabReceiver = new ChangeTabReceiver(); changeTabFilter = new IntentFilter(myApplication.CHANGE_TAB); registerReceiver(changeTabReceiver, changeTabFilter); 

最后在新的活动中,当你想closures这个活动并切换选项卡时,执行以下操作:

 Intent intent = new Intent(myApplication.CHANGE_TAB); this.sendBroadcast(intent); this.finish(); 

当然,你可以通过传递选项卡索引来切换到各个选项卡 – 但在我的情况下,这种行为只发生在一个活动,所以我决定保持简单…

 public void switchTab(int index){ MintTrack ParentActivity; ParentActivity = (MintTrack) this.getParent(); ParentActivity.getTabHost().setCurrentTab(index); } 

我只是把public static TabHost tabHost; 在我的TabActivity

然后从任何其他选项卡我可以做一个MyTabActivity.tabHost.setCurrentTab(tabNumber);

对我来说工作得很好(但是我希望从一开始就使用Fragments ..我只是遵循Android文档中的Tab教程并从那里开始工作)