2011-07-13 25 views
12

這裏是我的代碼:的Android TabHost.addTab - >空指針異常

public class Main extends Activity { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      TabHost tabHost = new TabHost(this); 

      TabHost.TabSpec tab = tabHost.newTabSpec("tab1"); 
      tab.setIndicator("Tab 1"); 
      tab.setContent(new TabHost.TabContentFactory() { 
       @Override 
       public View createTabContent(String tag) { 
        TextView tv = new TextView(Main.this); 
        tv.setText("tab 1 content"); 
        return tv; 
       } 
      }); 

      tabHost.addTab(tab); 

      setContentView(tabHost); 
     } 
    } 

我得到這個錯誤:

[...] 
    07-13 20:26:49.261: ERROR/AndroidRuntime(625): Caused by: java.lang.NullPointerException 
    07-13 20:26:49.261: ERROR/AndroidRuntime(625):  at android.widget.TabHost.addTab(TabHost.java:206) 
    07-13 20:26:49.261: ERROR/AndroidRuntime(625):  at test.test.Main.onCreate(Main.java:27) 
    [...] 

我需要通過代碼來做到這一點,我不能使用XML 。任何人都可以幫我修復這個代碼嗎?

回答

8

您應該使用TabActivity,它需要將相同的特殊佈局設置爲內容(請參閱http://developer.android.com/resources/tutorials/views/hello-tabwidget.html)。如果你不能使用XML,你應該建立從Java代碼相同的內容:

public class Main extends TabActivity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    TabHost tabHost = new TabHost(this); 
    tabHost.setId(android.R.id.tabhost); 

    TabWidget widget = new TabWidget(this); 
    widget.setId(android.R.id.tabs); 

    FrameLayout content = new FrameLayout(this); 
    content.setId(android.R.id.tabcontent); 

    LinearLayout layout = new LinearLayout(this); 
    layout.setOrientation(LinearLayout.VERTICAL); 
    layout.addView(widget); 
    layout.addView(content); 

    tabHost.addView(layout); 

    setContentView(tabHost); 

    TabHost.TabSpec tab1 = tabHost.newTabSpec("tab1"); 
    tab1.setIndicator("Tab 1"); 
    tab1.setContent(new TabHost.TabContentFactory() { 
     @Override 
     public View createTabContent(String tag) { 
      TextView tv = new TextView(Main.this); 
      tv.setText("tab 1 content"); 
      return tv; 
     } 
    }); 

    tabHost.addTab(tab1); 

    TabHost.TabSpec tab2 = tabHost.newTabSpec("tab2"); 
    tab2.setIndicator("Tab 2"); 
    tab2.setContent(new TabHost.TabContentFactory() { 
     @Override 
     public View createTabContent(String tag) { 
      TextView tv = new TextView(Main.this); 
      tv.setText("tab 2 content"); 
      return tv; 
     } 
    }); 

    tabHost.addTab(tab2); 

    setContentView(tabHost); 
} 

}

+0

不,我需要將一個選項卡作爲組件添加到活動中。 – Joel

+0

hm ...但TabHost無法在TabActivity外部工作。重點是將tabhost添加到預定義的活動(也許MapActivity或其他),不是嗎? – FeelGood

+0

不,這是一個圖書館。沒關係,如果不能完成,我會使用其他的東西,稍後再編輯一些更好的標籤。 – Joel

2

檢查框架源代碼中的方法TabHost.addTab(...)表明您的TabWidget尚不可用。在創建佈局時,必須先在代碼中或由系統創建TabWidget,並且必須具有ID爲android.R.id.tabs

1

您是否想過擴展TabActivity,然後調用getTabHost()來獲取TabHost的實例?不確定你的目標是什麼,但這可能值得關注。

+0

是的,我有,但tabactivity是一項活動,我需要一個視圖。 – Joel

44

對於誰可能會質疑TabActivity人遭到淘汰documentation說,你需要添加之前調用設置()標籤,當你不使用TabActivity。

tabHost.setup(); 
+2

謝謝! –

+0

我總是忘記這一點,並最終在你的評論。謝謝。 – Ruddles

+3

缺少文檔......如果你沒有找到這個特殊的方法,你就搞定了。太好了,謝謝! –