J'ai un res/layout/main.xml
incluant ces éléments et d'autres:
<some.package.MyCustomView android:id="@+id/foo" (some other params) />
<TextView android:id="@+id/boring" (some other params) />
Dans mon activité onCreate, je fais ceci:
setContentView(R.layout.main);
TextView boring = (TextView) findViewById(R.id.boring);
// ...find other elements...
MyCustomView foo = (MyCustomView) findViewById(R.id.foo);
if (foo == null) { Log.d(TAG, "epic fail"); }
Les autres éléments sont trouvés avec succès, mais foo
revient null. MyCustomView a un constructeur MyCustomView(Context c, AttributeSet a)
et un Log.d(...)
à la fin de ce constructeur apparaît avec succès dans logcat juste avant "l'échec épique".
Pourquoi est foo
nul?
(MyCustomView) foo = findViewById(R.id.foo);
êtreMyCustomView foo = (MyCustomView) findViewById(R.id.foo);
?J'ai le même problème car dans ma vue personnalisée, j'ai remplacé le constructeur mais j'ai appelé le super constructeur sans paramètre attrs. C'est du copier-coller)
Ma précédente version constructeur:
Maintenant j'ai:
Et ça marche!
la source
J'ai eu le même problème. Mon erreur a été que: j'ai écrit
et comme j'ai utilisé un gonfleur pour "charger" la vue à partir d'un fichier XML, la dernière ligne était fausse. Pour le résoudre, j'ai dû écrire:
J'ai écrit ma solution, au cas où quelqu'un aurait le même problème.
la source
Il semble qu'il y ait une variété de raisons. Je viens d'utiliser "Clean ..." dans Eclipse pour résoudre un problème similaire. (FindViewByID avait déjà fonctionné et, pour une raison quelconque, a commencé à renvoyer null.)
la source
Même problème, mais solution différente: je n'ai pas appelé
AVANT j'ai essayé de trouver la vue comme indiqué ici
la source
Si vous avez plusieurs versions de mise en page (en fonction de la densité de l'écran, des versions du SDK), assurez-vous qu'elles incluent toutes l'élément que vous recherchez.
la source
Dans mon cas, findViewById retournait null car ma vue personnalisée ressemblait à ceci dans le XML principal:
et j'ai découvert que lorsque j'ai ajouté les éléments xmlns, cela fonctionnait comme ceci:
la source
Assurez-vous que l'
setContentView(R.layout.main)
instruction appelle avant l'findViewById(...)
instruction;la source
Pour moi, le problème a été résolu lorsque j'ai ajouté le dossier res à la source dans le chemin de construction Java dans les paramètres du projet.
la source
J'ai rencontré le même problème il y a quelque temps lorsque j'ai ajouté une vue personnalisée via le XML de mise en page, puis j'ai essayé de joindre un rappel ailleurs dans l'application ...
J'ai créé une vue personnalisée et l'ai ajoutée à mon "layout_main.xml"
Et dans l'activité principale, je voulais attacher des rappels et obtenir des références aux éléments de l'interface utilisateur à partir du XML.
L'initiateur ne faisait rien d'extraordinaire, mais les modifications qu'il tentait d'apporter à la vue personnalisée (MUIComponent) ou à d'autres éléments d'interface utilisateur non personnalisés n'apparaissaient tout simplement pas dans l'application.
La différence entre "badInst" et "goodInst" est:
la source
Cela m'est arrivé avec un composant personnalisé pour Wear, mais c'est un conseil générique. Si vous utilisez un stub (tel que celui que j'utilisais
WatchViewStub
), vous ne pouvez pas simplement mettre l'appelfindViewById()
n'importe où. Tout ce qui se trouve à l'intérieur du talon doit être gonflé en premier, ce qui ne se produit pas seulement aprèssetContentView()
. Ainsi, vous devriez écrire quelque chose comme ceci pour attendre que cela se produise:la source
Mon problème était une faute de frappe. J'avais écrit
android.id
(point) au lieu deandroid:id
. : PApparemment, il n'y a pas de vérification de syntaxe dans mon xml de composant personnalisé. :(
la source
Avait le même problème.
J'avais une mise en page avec peu d'enfants. Du constructeur de l'un d'eux, j'essayais d'obtenir une référence (en utilisant context.findViewById) à un autre enfant. Cela ne fonctionnait pas car le deuxième enfant était défini plus en détail dans la mise en page.
Je l'ai résolu comme ceci:
Cela fonctionnerait aussi si l'ordre des enfants était opposé, mais je suppose que cela devrait généralement être fait comme ci-dessus.
la source
findViewById
dans le constructeur de aView
, mais plutôt mettre le code d'initialisationOnFinishInflate
?La
findViewById()
méthode retourne parfoisnull
lorsque la racine du layout n'a pas d'android:id
attribut. L'assistant Eclipse pour générer un fichier xml de mise en page ne génère pas automatiquement d'android:id
attribut pour l'élément racine.la source
Dans mon cas, la vue était dans le parent PAS dans la vue dans laquelle j'essayais de l'appeler. Donc, dans la vue enfant, j'ai dû appeler:
la source
L'option «propre» a fonctionné pour moi.
Dans mon cas, la cause première est que le code source réside sur un partage réseau et que mon poste de travail et mon serveur de fichiers n'étaient pas synchronisés correctement et avaient dérivé de 5 secondes. Les horodatages des fichiers créés par Eclipse sont dans le passé (car ils sont attribués par le serveur de fichiers) par rapport à l'horloge du poste de travail, ce qui oblige Eclipse à résoudre de manière incorrecte les dépendances entre les fichiers générés et les fichiers source. Dans ce cas, un «nettoyage» semble fonctionner, car il force une reconstruction complète au lieu d'une construction incrémentielle qui dépend de mauvais horodatages.
Une fois que j'ai corrigé les paramètres NTP sur mon poste de travail, le problème ne s'est plus jamais produit. Sans les paramètres NTP appropriés, cela se produirait toutes les quelques heures, car les horloges dérivent rapidement.
la source
Pour ajouter une autre erreur triviale aux réponses à rechercher:
Vérifiez que vous modifiez réellement le bon fichier XML de mise en page ...
la source
J'ai eu le même problème parce que j'ai oublié de mettre à jour l'identifiant de vue dans tous mes dossiers de mise en page.
la source