2011-07-13 10 views
12

Oto mój kod:Android TabHost.addTab -> Null pointer wyjątek

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); 
     } 
    } 

otrzymuję ten błąd:

[...] 
    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) 
    [...] 

muszę to zrobić za pomocą kodu i nie można korzystać z XML . Czy ktoś może mi pomóc naprawić ten kod, proszę?

Odpowiedz

8

Powinieneś używać TabActivity, potrzebuje tego samego specjalnego układu, aby ustawić jako treść (patrz http://developer.android.com/resources/tutorials/views/hello-tabwidget.html). Jeśli nie można użyć xml należy skonstruować taką samą zawartość z kodu 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

Nie muszę dodawać zakładki do działania jako komponentu. – Joel

+0

hm ... ale TabHost nie może działać poza TabActivity. Chodzi o to, aby dodać tabhost do predefiniowanej aktywności (być może MapActivity lub innej), nieprawdaż? – FeelGood

+0

nie dla biblioteki. nieważne, jeśli nie da się tego zrobić, skorzystam z czegoś innego i sam sam sam opublikuję lepsze karty. – Joel

2

Sprawdzanie metody TabHost.addTab (...) w źródle frameworka sugeruje, że Twój widget TabWidget nie jest jeszcze dostępny. TabWidget musi zostać utworzony w kodzie jako pierwszy lub przez system podczas tworzenia układu i musi mieć identyfikator android.R.id.tabs.

1

Czy myślisz o przedłużeniu TabActivity, a następnie wywołanie getTabHost(), aby uzyskać wystąpienie TabHost? Nie jestem pewien, jaki jest twój cel, ale warto na to patrzeć.

+0

Tak, mam, ale tabactivity to działanie i potrzebuję widoku. – Joel

44

Dla ludzi, którzy mogliby zastanawiać TabActivity wycofywana z documentation mówi, że trzeba zadzwonić Ustawienia() przed dodaniem zakładki, gdy nie używasz TabActivity.

tabHost.setup(); 
+2

Dzięki za to! –

+0

Zawsze zapominam ten kawałek i kończę na twoim komentarzu. Dzięki. – Ruddles

+3

Co za brak dokumentacji ... jeśli nie znajdziesz tej konkretnej metody, którą masz na głowie. Wielkie dzieki! –

Powiązane problemy