Dans mon fichier xml de mise en page, j'ai inclus un autre fichier xml de mise en page (chacun avec un identifiant Android différent).
<include layout="@layout/view_contact_name" android:id="+id/test1"/>
<include layout="@layout/view_contact_name" android:id="+id/test2"/>
Mais lorsque je l'exécute dans l'émulateur et que je lance Hierarchy Viewer, chaque mise en page affiche toujours 'NO_ID', et dans mon code, j'ai
findViewById(R.id.test1)
et les findViewById(R.id.test2)
deux retournent null.
Quelqu'un peut-il m'aider s'il vous plaît avec mon problème?
android
android-layout
hap497
la source
la source
@
symbole.Réponses:
Spécifiez l'ID dans le
<include>
Utilisez ensuite deux
findViewById
pour accéder aux champs dans la mise en pageEn utilisant cette approche, vous pouvez accéder à n'importe quel champ dans n'importe quel include que vous avez.
la source
merge
même en théorie, car le résultat de l'inclusion d'une vuemerge
n'est pas une vue unique, mais un tas d'entre elles. Donc c'est d'accord.J'ai découvert que si vous utilisez une
<merge>
balise dans votre mise en page d'inclusion, l'ID de l'inclusion est transféré vers la balise de fusion qui n'est pas une vue réelle.Donc, supprimez la fusion ou remplacez-la par une mise en page.
Tor Norbye a écrit :
la source
Romain Guy indique que vous pouvez remplacer l'ID d'une mise en page incluse en mettant un
android:id
attribut à l'intérieur de la<include>
balise.la source
Je pense que la première réponse passe à côté du point le plus important et pourrait induire les gens en erreur en leur faisant croire que la
<include/>
balise crée une vue qui contient le contenu d'inclusion.Le point clé est que l' identifiant de l'inclusion est passé à la vue racine du fichier de mise en page de l'inclusion.
Cela signifie que ceci:
Devient ceci:
la source
Oui, c'est comme ça, mais attention lorsque la mise en page insérée dans le champ d'inclusion est personnalisée et que vous souhaitez accéder à cette mise en page racine. Cette mise en page dans ce cas @ layout / test test, est en fait renvoyée en première ligne.
la source
la source
Le problème est que nous essayons d'utiliser un id qui n'est pas déclaré dans le fichier de mise en page actuel. Au lieu de déclarer à nouveau, id peut être simplement référencé en utilisant
@+id/
. Si vous refactorisez le nom de l'identifiant d'origine via Android Studio, il le refactorise également dans la disposition incluse.la source
Dans un cas d'utilisation,
<RecyclerView>
recherchez l'id de<include>
en utilisant une instance de vue gonflée, sinon il retournera null .la source
Si vous avez défini id sur l'une des balises racine de la mise en page incluse, vous pouvez utiliser cet identifiant ou vous pouvez définir l'identifiant sur la mise en page incluse.
Mais vous ne pouvez pas définir id sur les deux, cela peut générer une exception.
Ou
la source
Lorsque vous parlez d'inclusion, vous avez soit un identifiant sur la vue racine à l'intérieur du fichier de mise en page inclus, soit sur la ligne d'inclusion elle-même et non sur les deux. Par exemple:
Fichier de mise en page 1
L'exemple ci-dessus est faux car techniquement, vous avez deux identifiants déclarés pour la même mise en page. Donc, ce que vous devez faire est de choisir quel élément aura l'id.
la source
Wow, je ne peux pas croire que cette question n'ait pas encore la bonne réponse. Ce sont des balises simples, nulles. Vous ne pouvez changer que les choses qui commencent par celles
android:layout_
quiandroid:id
ne correspondent pas. Donc, la réponse est que vous ne pouvez pas. Désolé. Ce que vous pouvez faire à la place est de créer une classe qui sera un ViewGroup qui gonflera les vues incluses à l'intérieur, puis l'ajoutera en tant que balise dans votre mise en page, mais c'est à peu près tout.la source