2011-05-27 80 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才能正確處理歷史記錄,但這取決於項目。

相關問題