289 votes

findViewByID renvoie null

Tout d'abord: oui, j'ai lu tous les autres fils sur ce sujet. Et pas seulement ceux de ce site... (vous voyez, je suis un peu frustré)

La plupart d'entre eux viennent avec les conseils d'utilisation android:id au lieu de simplement en id dans le fichier XML. Je l'ai fait.

Des autres, j'ai appris, qu' View.findViewById des œuvres différentes de Activity.findViewById. J'ai manipulé que, trop.

Dans mon location_layout.xml, j'utilise:

<FrameLayout .... >
    <some.package.MyCustomView ... />

    <LinearLayout ... >
        <TextView ...
            android:id="@+id/txtLat" />
        ...
    </LinearLayout>
</FrameLayout>

Dans mon Activité je fais:

...
setContentView( R.layout.location_layout );

et dans ma classe de vue personnalisée:

... 
TextView tv = (TextView) findViewById( R.id.txtLat );

qui renvoie null. Ce faisant, mon Activité fonctionne très bien. Alors peut-être que c'est à cause de l' Activity.findViewById et View.findViewById différences. Je l'ai donc rangé le contexte passé à la douane de vue constructeur localement et essayé:

...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );

qui a également retourné null.

Ensuite, j'ai changé ma vue personnalisée pour étendre ViewGroup plutôt View et changé l' location_layout.xml laisser l' TextView être un enfant direct de ma vue personnalisée, de sorte que l' View.findViewById devrait fonctionner comme le suppose. Surprise: il n'est pas résoudre quoi que ce soit.

Donc, ce que le diable ai-je fait de mal?

Je vais apprécions tous les commentaires.

305voto

CommonsWare Points 402670

qui retourne null

Peut-être parce que vous l'appelez trop tôt. Attendez jusqu'à ce que onFinishInflate() . Voici un exemple de projet montrant une vue personnalisée accédant à son contenu.

168voto

Bayram Boyraz Points 561

Eventuellement, vous appelez findViewById avant d'appeler setContentView ? Si c'est le cas, essayez d'appeler findViewById AFTER en appelant setContentView

107voto

Joe Points 401

Assurez-vous de ne pas avoir plusieurs versions de votre mise en page pour différentes densités d'écran. J'ai rencontré ce problème une fois en ajoutant un nouvel identifiant à une mise en page existante, mais j'ai oublié de mettre à jour la version hdpi. Si vous oubliez de mettre à jour toutes les versions du fichier de disposition, cela fonctionnera pour certaines densités d'écran mais pas pour d'autres.

16voto

infografnet Points 385

Dans mon cas, j'ai eu 2 activites dans mon projet, main.xml et main2.xml. Depuis le début, main2 était une copie de l' main, et tout fonctionnait bien, jusqu'à ce que j'ai ajouté le nouveau TextView de main2, de sorte que l' R.id.textview1 est devenu disponible pour le reste de l'application. Puis j'ai essayé de chercher par appel standard:

TextView tv = (TextView) findViewById( R.id.textview1 );

et il a toujours été nul. Il s'est avéré, que dans onCreate constructeur, j'ai été l'instanciation pas main2, mais l'autre. J'ai eu:

setContentView(R.layout.main);

au lieu de

setContentView(R.layout.main2);

Je l'ai remarqué après que je suis arrivé ici, sur le site.

6voto

Josh Metcalfe Points 1646

Une réponse pour ceux qui utilisent ExpandableListView et exécuter dans cette question, basée sur le titre.

J'ai eu cette erreur en essayant de travailler avec TextViews de mon enfant et groupe de points de vue dans le cadre d'un ExpandableListView mise en œuvre.

Vous pouvez utiliser quelque chose comme ce qui suit dans votre implémentations de la getChildView() et getGroupView() méthodes.

        if (convertView == null) {
            LayoutInflater inflater =  (LayoutInflater) myContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.child_layout, null);
        }

J'ai trouvé ce ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X