Tout d'abord: oui, j'ai lu toutes les autres discussions sur ce sujet. Et pas seulement ceux de ce site ... (vous voyez, je suis un peu frustré)
La plupart d'entre eux sont accompagnés des conseils à utiliser android:id
plutôt que simplement id
dans le fichier XML. J'ai fait.
D'après d'autres, j'ai appris que cela View.findViewById
fonctionne différemment Activity.findViewById
. J'ai aussi géré ça.
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 revient null
. Ce faisant, mon activité fonctionne bien. C'est peut-être à cause des différences Activity.findViewById
et View.findViewById
. J'ai donc stocké localement le contexte transmis au constructeur de la vue des douanes et j'ai essayé:
...
TextView tv = (TextView) ((Activity) context).findViewById( R.id.txtLat );
qui est également revenu null
.
Ensuite, j'ai changé ma vue personnalisée pour l'étendre à la ViewGroup
place View
et j'ai changé location_layout.xml
pour laisser le TextView
être un enfant direct de ma vue personnalisée, afin que le View.findViewById
fonctionne comme prévu. Surprise: cela n'a rien résolu.
Alors qu'est-ce que je fais mal?
J'apprécierai tout commentaire.
la source
Réponses:
Peut-être parce que vous l'appelez trop tôt. Attendez
onFinishInflate()
. Voici un exemple de projet démontrant une personnalisation de l'View
accès à son contenu.la source
onFinishInflate()
.Peut-être appelez-vous
findViewById
avant d'appelersetContentView
? Si tel est le cas, essayez d'appelerfindViewById
APRÈS avoir appelésetContentView
la source
Assurez-vous que vous n'avez pas plusieurs versions de votre mise en page pour différentes densités d'écran. J'ai rencontré ce problème une fois lors de l'ajout d'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 mise en page, cela fonctionnera pour certaines densités d'écran mais pas pour d'autres.
la source
FindViewById peut être null si vous appelez le mauvais super constructeur dans une vue personnalisée. La balise ID fait partie des attrs, donc si vous ignorez les attrs, vous supprimez l'ID.
Ce serait faux
C'est correct
la source
Dans mon cas, j'avais 2 activités dans mon projet,
main.xml
etmain2.xml
. Dès le début,main2
était une copiemain
, et tout a bien fonctionné, jusqu'à ce que j'ajouté nouveauTextView
àmain2
, de sorte que le sontR.id.textview1
devenus disponibles pour le reste de l' application. Ensuite, j'ai essayé de le récupérer par un appel standard:et c'était toujours nul. Il s'est avéré que chez le
onCreate
constructeur, je n'instanciais pasmain2
, mais l'autre. J'ai eu:au lieu de
Je l'ai remarqué après mon arrivée ici, sur le site.
la source
A côté des causes classiques, évoquées ailleurs:
setContentView()
avantfindViewById()
id
vous voulez se trouve dans la vue ou la mise en page que vous avez donnée àsetContentView()
id
n'est pas accidentellement dupliqué dans différentes dispositionsIl y en a un que j'ai trouvé pour les vues personnalisées dans les mises en page standard, ce qui va à l'encontre de la documentation:
En théorie, vous pouvez créer une vue personnalisée et l'ajouter à une mise en page ( voir ici ). Cependant, j'ai constaté que dans de telles situations, parfois l'
id
attribut fonctionne pour toutes les vues de la mise en page, à l'exception des vues personnalisées. La solution que j'utilise est:FrameLayout
avec les mêmes propriétés de mise en page que vous souhaitez que la vue personnalisée ait. Donnez-lui une réponse appropriéeid
, par exempleframe_for_custom_view
.Dans
onCreate
:ce qui place la vue personnalisée dans le cadre.
la source
la source
Une réponse pour ceux qui utilisent ExpandableListView et se heurtent à cette question en fonction de son titre.
J'ai eu cette erreur en essayant de travailler avec TextViews dans mes vues enfant et groupe dans le cadre d'une implémentation ExpandableListView.
Vous pouvez utiliser quelque chose comme ce qui suit dans vos implémentations des méthodes getChildView () et getGroupView ().
J'ai trouvé ça ici .
la source
Je suis assez nouveau sur Android / Eclipse, par erreur, j'ai ajouté des éléments d'interface utilisateur à la
activity_main.xml
place defragment_main.xml
. Cela m'a pris quelques heures pour comprendre cela ...la source
FWIW, je ne vois pas que quelqu'un ait résolu cela de la même manière que je le devais. Aucune plainte au moment de la compilation, mais j'obtenais une vue nulle au moment de l'exécution et j'appelais les choses dans le bon ordre. Autrement dit, findViewById () après setContentView (). Le problème s'est avéré que ma vue est définie dans content_main.xml, mais dans mon activity_main.xml, je manquais cette seule déclaration:
Lorsque j'ai ajouté cela à activity_main.xml, plus de NullPointer.
la source
J'ai eu le même problème. J'utilisais une bibliothèque tierce qui vous permet de remplacer leur adaptateur pour une GridView et de spécifier votre propre disposition pour chaque cellule GridView.
J'ai finalement réalisé ce qui se passait. Eclipse utilisait toujours le fichier XML de mise en page de la bibliothèque pour chaque cellule du GridView, même si cela ne donnait aucune indication à ce sujet. Dans mon adaptateur personnalisé, il a indiqué qu'il utilisait la ressource xml de mon propre projet même si au moment de l'exécution, ce n'était pas le cas.
Donc, ce que j'ai fait était de m'assurer que mes mises en page et identifiants xml personnalisés étaient différents de ceux qui se trouvaient toujours dans la bibliothèque, nettoyé le projet, puis il a commencé à lire les mises en page personnalisées correctes qui étaient dans mon projet.
En bref, soyez prudent si vous remplacez l'adaptateur d'une bibliothèque tierce et spécifiez votre propre format XML pour l'adaptateur à utiliser. Si votre mise en page à l'intérieur de votre projet a le même nom de fichier que celui de la bibliothèque, vous pourriez rencontrer un bogue vraiment difficile à trouver!
la source
Dans mon cas particulier, j'essayais d'ajouter un pied de page à un ListView. L'appel suivant dans onCreate () retournait null.
Changer cela pour gonfler la vue de pied de page au lieu de la trouver par ID a résolu ce problème.
la source
Dans mon cas, j'utilisais ExpandableListView et j'avais réglé
android:transcriptMode="normal"
. Cela faisait disparaître quelques enfants du groupe extensible et j'obtenais une exception NULL chaque fois que j'utilisais la liste.la source
Pour moi, j'avais deux dispositions xml pour la même activité - une en mode portrait et une en paysage. Bien sûr, j'avais changé l'identifiant d'un objet dans le paysage xml mais j'avais oublié de faire le même changement dans la version portrait. Assurez-vous que si vous en changez un, vous faites de même avec l'autre xml ou vous n'obtiendrez pas d'erreur jusqu'à ce que vous l'exécutiez / déboguez et il ne trouvera pas l'id que vous n'avez pas changé. Oh stupides erreurs, pourquoi devez-vous me punir ainsi?
la source
Définissez le contenu de l'activité à partir d'une ressource de mise en page. à savoir.,
setContentView(R.layout.basicXml)
;la source
En plus des solutions ci-dessus, vous vous assurez que la mise
tools:context=".TakeMultipleImages"
en page a la même valeur dans le fichier mainfest.xml:android:name=".TakeMultipleImages"
pour le même élément d'activité. cela se produit lors de l'utilisation du copier-coller pour créer une nouvelle activitéla source
J'ai le même problème, mais je pense que cela vaut la peine d'être partagé avec vous. Si vous devez trouver ViewById dans une mise en page personnalisée, par exemple:
vous ne pouvez pas obtenir la vue dans le constructeur. Vous devez appeler findViewById une fois la vue gonflée. C'est une méthode que vous pouvez remplacer
onFinishInflate
la source
Je voulais juste jeter mon cas spécifique ici. Pourrait aider quelqu'un au bout du compte.
J'utilisais la directive dans mon XML UI Android comme ceci:
Vue parent:
Vue enfant (retry_button):
.findViewById (R.id.retry) retournerait toujours null. Mais, si j'ai déplacé l'ID de la vue enfant dans la balise include, cela a commencé à fonctionner.
Parent fixe:
Enfant fixe:
la source
Mon cas n'est pas comme ci-dessus, aucune solution n'a fonctionné. Je suppose que ma vue était trop profonde dans la hiérarchie de mise en page. Je l'ai déplacé d'un niveau et ce n'était plus nul.
la source
Dans mon cas, j'avais gonflé la mise en page, mais les vues enfant retournaient nulles. À l'origine, j'avais ceci:
Cependant, lorsque je l'ai changé comme suit, cela a fonctionné:
La clé était de référencer spécifiquement la disposition déjà gonflée afin d'obtenir les vues enfant. Autrement dit, pour ajouter
footerView
:la source
D'après mon expérience, il semble que cela puisse également se produire lorsque votre code est appelé après OnDestroyView (lorsque le fragment se trouve sur la pile arrière.) Si vous mettez à jour l'interface utilisateur sur l'entrée d'un BroadCastReceiver, vous devez vérifier si c'est le cas .
la source
GONFLEZ LA DISPOSITION !! (qui contient l'identifiant)
Dans mon cas, findViewById () a retourné null, car la disposition dans laquelle l'élément a été écrit n'était pas gonflée ...
Par exemple. fragment_layout.xml
findViewById (R.id.listview) a retourné null, car je n'avais pas fait inflater.inflate (R.layout.fragment_layout, ..., ...); avant cela.
J'espère que cette réponse aide certains d'entre vous.
la source
Ma solution était de simplement nettoyer le projet.
la source
findViewById peut également retourner null si vous êtes dans un fragment. Comme décrit ici: findViewById in Fragment
Vous devez appeler getView () pour renvoyer la vue de niveau supérieur à l'intérieur d'un fragment. Ensuite, vous pouvez trouver les éléments de mise en page (boutons, vues de texte, etc.)
la source
J'ai essayé tout ce qui précède, rien ne fonctionnait .. j'ai donc dû rendre mon ImageView statique
public static ImageView texture;
et ensuitetexture = (ImageView) findViewById(R.id.texture_back);
, je ne pense pas que ce soit une bonne approche mais cela a vraiment fonctionné pour mon cas :)la source
Dans mon cas, findViewById a retourné null lorsque j'ai déplacé l'appel d'un objet parent vers un objet adaptateur instancié par le parent. Après avoir essayé les astuces répertoriées ici sans succès, j'ai replacé le findViewById dans l'objet parent et transmis le résultat en tant que paramètre lors de l'instanciation de l'objet adaptateur. Par exemple, je l'ai fait dans l'objet parent:
J'ai ensuite passé le hdSpinner comme paramètre lors de la création de l'objet adaptateur:
la source
Il s'est bloqué pour moi car l'un des champs de mon ID d'activité correspondait à l'ID d'une autre activité. Je l'ai corrigé en donnant un identifiant unique.
Dans mon identifiant de champ de mot de passe loginActivity.xml, c'était "mot de passe". Dans mon activité d'enregistrement, je l'ai juste corrigé en donnant l'id r_password, puis il a renvoyé un objet non nul:
la source
J'étais confronté à un problème similaire lorsque j'essayais de créer une vue personnalisée pour a
ListView
.Je l'ai résolu simplement en faisant ceci:
la source
Façons de déboguer et de trouver le problème:
Dans mon cas, j'utilisais activity_main.xml à la fois dans mon module d'application et dans mon module de bibliothèque. Ainsi, lorsque j'ai effectué les étapes ci-dessus, au lieu de la mise en page que j'ai conçue dans la bibliothèque, la mise en page à l'intérieur du module d'application a été gonflée.
J'ai donc changé le nom du fichier activity_main.xml en activity_main_lib.xml.
Assurez-vous donc que vous n'avez pas de noms de mise en page en double dans l'ensemble de votre projet .
la source