从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);
}
很标准。而且效果很好。现在,假设我在选项卡中实例化的活动中有一个按钮(或菜单项,等等)。当用户按下此按钮时,我希望删除活动并删除其中的选项卡。 我似乎找不到一种简单的方法来执行此操作。我已经找到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)
由于某种原因,在添加选项卡时,它会尝试设置当前选项卡,并且会遇到空指针异常。 如果你们可以建议实现我想做的另一种方法,或者解决当前方法的方法,我将不胜感激。     

解决方法

        尝试将当前选项卡更改为0。 就像是:
getTabHost().setCurrentTab(0);
getTabHost().clearAllTabs();
我在读,如果您未在调用(
.clearAllTabs()
)之前将Tabhost设置为第一个标签(
.setCurrentTab(0)
),则调用calling6ѭ会抛出
nullpointerexception
。 另外这个答案可能有帮助吗? (如何从TabHost删除选项卡)     ,        我建议使用另一种方法。您可以使用ActivityGroup来构建自己的TabControl。当您使用普通按钮(或您喜欢的类似控件)时,您可以根据需要轻松地排列/创建/删除它们。 我无法在此处转储整个代码,但这基本上是我遇到相同问题时所做的事情: 创建从ActivityGroup继承的Activity 在您要显示子活动的布局中放置一个ViewGroup 根据需要设置按钮(LinearLayout与可变数量的按钮配合使用时效果很好) 根据需要通过getLocalActivityManager()。startActivity()启动活动 现在,您可以根据需要添加/删除按钮。 Activites遵循Android生命周期,因此您不必自己删除它们。 您可能必须在ActivityGroup上实现onBackPressed才能正确处理历史记录,但这取决于项目。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...