2011-07-13 10 views
12

は私のコードです:アンドロイドTabHost.addTabは - > nullポインタ例外ここ

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参照)。 documentation廃止さTabActivityについて疑問に思うかもしれません人のために

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の外では動作できません。ポイントは、定義済みのアクティビティ(たぶんMapActivityなど)にtabhostを追加することです。 – FeelGood

+0

いいえ、ライブラリ用です。気にしない、できないなら、私は何か他のものを使用し、後で自分自身でいくつかの良いタブをプログラムします。 – Joel

2

フレームワークソースのメソッドTabHost.addTab(...)を確認すると、TabWidgetがまだ使用できないことが示唆されます。 TabWidgetは、レイアウトを作成するときに最初にコードまたはシステムによって作成され、IDがandroid.R.id.tabsである必要があります。

1

TabActivityを拡張し、getTabHost()を呼び出してTabHostのインスタンスを取得することを考えましたか?あなたの目的が何であるかは分かりませんが、これは見て分かるかもしれません。

+0

はい、私は持っていますが、tabactivityはアクティビティです。私はビューが必要です。 – Joel

44

はあなたが追加する前にセットアップを()を呼び出す必要があると述べている:あなたは、XMLを使用することができない場合は、Javaコードから同じコンテンツを構築する必要がありますタブ、TabActivityを使用しない場合。

tabHost.setup(); 
+2

ありがとう! –

+0

私はいつもこのビットを忘れて、あなたのコメントで終わります。ありがとう。 – Ruddles

+3

ドキュメンテーションが不足しています...あなたがこの特定の方法を見つけなければ、あなたはうんざりしています。素晴らしいです、ありがとう! –