从TabHost中删除选项卡及其内部的活动(意图)

时间:2011-05-27 20:28:54

标签: android android-tabhost

我有一个可以动态创建标签的应用。当我创建一个标签时,我会发起一个活动作为意图。像这样:

private void addTab(Context packageContext, Class<?> newClass, TabHost mTabHost, String tabId, String tabLabel){
    // newClass is my Activity class that I want to start in the tab
    Intent intent = new Intent().setClass(packageContext, newClass);
    TabHost.TabSpec spec;
    spec = mTabHost.newTabSpec(tabId).setIndicator(tabLabel)
                  .setContent(intent);
    mTabHost.addTab(spec);
    mTabHost.setCurrentTabByTag(tabId);
}

非常标准。而且效果很好。现在,假设我在我的选项卡中实例化的活动中有一个按钮(或menuitem,无论如何)。当用户按下此按钮时,我希望删除并销毁活动及其所在的选项卡。

我似乎无法找到一种简单的方法来做到这一点。我找到了TabHost.clearAllTabs()函数,但这会破坏所有标签和活动,我只想删除一个。

有人建议我保存我打开的所有标签的列表,然后调用clearAllTabs(),之后我重新创建除了我不想要的所有其他标签。

这样的事情:

public static ArrayList<TabHost.TabSpec> list = new ArrayList<TabHost.TabSpec>();

我将这一行添加到我的addTab()函数中,以便我创建的每个选项卡都记在我的ArrayList中:

list.add(spec);

然后当我想删除我的标签时,我运行此功能:

public static void removeTab(){
    list.remove(list.size()-1); // remove it from memory
    mTabHost.clearAllTabs();  // clear all tabs from the tabhost
    for(TabHost.TabSpec spec : list) // add all that you remember back
        mTabHost.addTab(spec);
}

这将从我的ArrayList中删除我的选项卡,删除所有选项卡,然后使用我的ArrayList重新创建剩余的所有选项卡。理论上它应该可以工作,但是当我尝试调用这个函数时,我得到以下错误:

FATAL EXCEPTION: main
java.lang.NullPointerException
at android.widget.TabWidget.setCurrentTab(TabWidget.java:342)
at android.widget.TabWidget.focusCurrentTab(TabWidget.java:366)
at android.widget.TabHost.setCurrentTab(TabHost.java:323)
at android.widget.TabHost.addTab(TabHost.java:216)
at com.example.myapp.TabManager.removeTab(QuikBrowser.java:86)
at com.example.myapp.TabManager.TabWindow.onOptionsItemSelected(TabWindow.java:91)
at android.app.Activity.onMenuItemSelected(Activity.java:2205)

由于某种原因,在添加选项卡时,它会尝试设置当前选项卡,并且会遇到空指针异常。

如果你们可以提出另一种方法来实现我想要做的事情,或者某种方法来修复我现有的方法,我将不胜感激。

2 个答案:

答案 0 :(得分:14)

尝试将当前标签更改为0.

类似的东西:

getTabHost().setCurrentTab(0);
getTabHost().clearAllTabs();

我正在读取,如果在调用(clearAllTabs();)<之前未将tabhost设置为第一个选项卡(nullpointerexception),则调用.setCurrentTab(0)将抛出.clearAllTabs() < / p>

这个答案可能有帮助吗? (How to remove tab from TabHost

答案 1 :(得分:1)

我建议采用不同的方法。您可以使用ActivityGroup构建自己的TabControl。当您使用普通按钮(或您喜欢的类似控件)时,您可以根据需要轻松地安排/创建/删除它们。

我无法在此处转储整个代码,但这基本上就是我遇到同样问题时所做的事情:

  • 创建从ActivityGroup继承的活动
  • 在您要展示子活动的布局中放置ViewGroup
  • 根据需要设置按钮(LinearLayout可以使用可变数量的按钮工作)
  • 根据需要通过getLocalActivityManager()。startActivity()启动活动

您现在可以根据需要添加/删除按钮。 Activites遵循Android生命周期,因此您无需自行删除它们。

您可能必须在ActivityGroup上实现onBackPressed以正确处理历史记录,但这取决于项目。

相关问题