2011-05-27 77 views
4

我有一个应用程序可以动态地创建选项卡。当我创建一个标签页时,我开始一个活动作为一个意图。像这样:从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中删除我的选项卡,删除所有选项卡,t母鸡使用我的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) 

出于某种原因,添加标签时,它会尝试设置当前选项卡,它击中一个空指针异常。

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

回答

14

尝试改变当前选项卡为0

喜欢的东西:

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

我读,调用clearAllTabs();将抛出一个nullpointerexception,如果你不将tabhost设置为第一个选项卡(.setCurrentTab(0))致电(.clearAllTabs()

此问题也可能对此有帮助吗? (How to remove tab from TabHost

+1

谢谢!这是问题。 – Pete 2011-05-28 23:58:19

+0

ahh很好听:)在我目前的应用程序中,我正在处理很多标签,所以这对我来说也可以派上用场,这对我来说也是很有用的。 – wired00 2011-05-29 00:25:34

+0

thanks wired00,对我也有帮助。 – efeyc 2011-09-13 13:43:32

1

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

我不能在这里放弃整个代码,但是,基本上是我做过什么,当我有同样的问题:

  • 创建活动从的ActivityGroup
  • 继承
  • 放置一个ViewGroup中在你的布局,你要显示的子活动
  • 设置需要你的按钮(LinearLayout中正常工作与按钮的变盘点)
  • 开始activites通getLocalActivityManager()。根据需要startActivity()

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

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

相关问题