如何解决从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才能正确处理历史记录,但这取决于项目。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。