2010-05-31 4 views
4

J'écris un programme Android dans lequel j'ai une activité qui utilise des onglets.Pourquoi j'obtiens une exception de pointeur nul à partir de TabWidget?

L'activité

public class UnitActivity extends TabActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    TabHost tabHost = getTabHost(); 
    TabSpec spec; 
    Resources res = getResources(); 

    LayoutInflater.from(this).inflate(R.layout.unit_view, tabHost.getTabContentView(), true); 

    spec = tabHost.newTabSpec("controls"); 
    spec.setIndicator("Control", res.getDrawable(R.drawable.ic_tab_equalizer)); 
    spec.setContent(R.id.txtview); 
    tabHost.addTab(spec); 
} 

}

Le XML référencé par R.layout.unit_view

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="5dp"> 
    <TabWidget android:id="@android:id/tabs" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
    <FrameLayout android:id="@android:id/tabcontent" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:padding="5dp"> 
     <TextView android:id="@+id/txtview" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:gravity="bottom" 
      android:text="nullpointer this!" /> 
    </FrameLayout> 
    </LinearLayout> 
</TabHost> 

Pour autant que je peux voir que je fais la même chose que je vois dans l'échantillon api tabs1 de l'android sdk. J'ai essayé "getLayoutInflator()" au lieu de "LayoutInflator.from (this)" avec le même résultat. Si je remplace la ligne LayoutInflater par "setContentView (R.layout.unit_view)" mon programme ne plante pas avec une exception null pointeur mais mon contenu est complètement vide et vide. J'ai l'onglet et c'est tout.

J'ai vérifié pour m'assurer que R.layout.unit_view et tabHost ne sont pas null quand il exécute la ligne LayoutInflater et ils semblent être bien. Ils ne sont définitivement pas nulles. J'ai aussi vérifié que LayoutInflater.from (this) renvoie un objet inflatable de mise en page valide et c'est le cas.

Le logcat indiquant l'erreur dit

 
E/AndroidRuntime( 541): java.lang.NullPointerException 
E/AndroidRuntime( 541): at android.widget.TabWidget.dispatchDraw(TabWidget.java:206) 
E/AndroidRuntime( 541): at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
E/AndroidRuntime( 541): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
E/AndroidRuntime( 541): at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
E/AndroidRuntime( 541): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
E/AndroidRuntime( 541): at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
E/AndroidRuntime( 541): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
E/AndroidRuntime( 541): at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
E/AndroidRuntime( 541): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
E/AndroidRuntime( 541): at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
E/AndroidRuntime( 541): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
E/AndroidRuntime( 541): at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
E/AndroidRuntime( 541): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
E/AndroidRuntime( 541): at android.view.View.draw(View.java:6538) 
E/AndroidRuntime( 541): at android.widget.FrameLayout.draw(FrameLayout.java:352) 
E/AndroidRuntime( 541): at android.view.ViewGroup.drawChild(ViewGroup.java:1531) 
E/AndroidRuntime( 541): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
E/AndroidRuntime( 541): at android.view.ViewGroup.drawChild(ViewGroup.java:1529) 
E/AndroidRuntime( 541): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258) 
E/AndroidRuntime( 541): at android.view.View.draw(View.java:6538) 
E/AndroidRuntime( 541): at android.widget.FrameLayout.draw(FrameLayout.java:352) 
E/AndroidRuntime( 541): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830) 
E/AndroidRuntime( 541): at android.view.ViewRoot.draw(ViewRoot.java:1349) 
E/AndroidRuntime( 541): at android.view.ViewRoot.performTraversals(ViewRoot.java:1114) 
E/AndroidRuntime( 541): at android.view.ViewRoot.handleMessage(ViewRoot.java:1633) 
E/AndroidRuntime( 541): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 541): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 541): at android.app.ActivityThread.main(ActivityThread.java:4363) 
E/AndroidRuntime( 541): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime( 541): at java.lang.reflect.Method.invoke(Method.java:521) 
E/AndroidRuntime( 541): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
E/AndroidRuntime( 541): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
E/AndroidRuntime( 541): at dalvik.system.NativeStart.main(Native Method) 
I/Process ( 61): Sending signal. PID: 541 SIG: 3 
I/dalvikvm( 541): threadid=7: reacting to signal 3 
I/dalvikvm( 541): Wrote stack trace to '/data/anr/traces.txt' 

quelqu'un a une idée comment je peux obtenir ce contenu dans un onglet sans écraser ma demande? Mon programme actuel est plus complexe et a plus d'un onglet, mais je l'ai simplifié pour tenter de trouver pourquoi il plante, mais il se bloque toujours et je ne sais pas pourquoi.

Si je n'utilise pas LayoutInflator mon programme ne plante pas mais je n'ai pas non plus de contenu, juste des onglets.

Répondre

1

Cela fonctionne pour moi:

tabHost = getTabHost(); 

     tabHost.addTab(tabHost.newTabSpec("upcoming").setIndicator(
       getResources().getString(R.string.upcoming)).setContent(R.id.cell1)); 

XML partiel

<?xml version="1.0" encoding="utf-8"?> 
<TabHost xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/tabhost" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <LinearLayout android:orientation="vertical" 
     android:layout_width="fill_parent" android:layout_height="fill_parent"> 
     <TabWidget android:id="@android:id/tabs" 
      android:layout_width="fill_parent" android:layout_height="wrap_content" /> 
     <FrameLayout android:id="@android:id/tabcontent" 
      android:layout_width="fill_parent" android:layout_height="fill_parent"> 
      <include android:id="@+id/cell1" 
       layout="@layout/my_layout_file" /> 
      <!-- another include for cell2, and the closing tags --> 
+0

Cela a fonctionné avec le rajout de "setContentView (R.layout.unit_view)" Merci pour l'entrée! – rushinge

20

Pour ceux d'entre vous qui utilisent un TabHost pas dans un TabActivity, alors assurez-vous d'appeler TabHost.setup() . Voici la documentation pour cela: http://developer.android.com/reference/android/widget/TabHost.html#setup() Ne pas le faire entraînera une exception NullPointerException lorsque vous essayez d'ajouter des onglets à votre tabhost.

Le tutoriel ne mentionne pas cela, alors j'ai pensé que je porterais à votre attention pour vous épargner le temps que j'ai passé à le chercher.

+1

Merci @Felix .. appelant 'TabHost.setup()' a résolu mon problème. – Zeba

+0

Merci @Felix a travaillé pour moi aussi. –

0

Je voulais juste donner une idée sur la base des déclarations d'ici:

http://code.google.com/p/android/issues/detail?id=14929

Le TabWidget est à l'origine d'un accident si vous essayez de le tirer avant de charger les données. Pour éviter cela, utilisez simplement vos tâches/gestionnaires asynchrones non seulement pour charger les données, mais aussi pour définir l'affichage du contenu. Bien sûr, vous pouvez utiliser une autre vue ou une boîte de dialogue de progression pendant le processus de chargement des données, mais ne présentez pas encore le support des onglets.

0

ANNÉE! Vous devez appeler:

TabHost.setup()

avant d'appeler la méthode. sinon, TabWidget TabHost devrait être null. J'ai fait cette erreur depuis si longtemps.

+0

Cela ne fonctionne pas. –

Questions connexes