Puis-je utiliser le même identifiant dans une mise en page différente sous Android?

90

Je suis nouveau dans le développement Android. Est-il correct d'utiliser le même ID pour les images et TextViewsdans différents Layoutfichiers XML?

Quand eclipse les répertorie automatiquement pour moi, il répertorie toutes les variables de mise en page du projet, alors va-t-il entrer en collision? Jusqu'à présent, je n'ai remarqué aucun problème en utilisant le même identifiant dans différentes mises en page, mais je suis préoccupé à long terme.

happyhardik
la source
Article connexe - Deux vues avec le même identifiant
RBT
@Pavel vous aurez toujours besoin des identifiants pour ajuster les contraintes.
Sadda Hussain

Réponses:

96

Il est recommandé d'utiliser des identifiants différents pour différentes mises en page. Sur le long terme, lorsque vous aurez beaucoup de mises en page et donc beaucoup d'identifiants, il sera très compliqué de les différencier.

Je nomme habituellement mes ids comme ceci: layoutName_elementId.

Cela fonctionne pour moi de trouver facilement l'identifiant que je recherche, en particulier lorsque j'utilise la saisie semi-automatique (je sais sur quelle mise en page je travaille, mais je ne connais pas vraiment l'identifiant; dans ce cas, avec ma stratégie de nommage, je tapez uniquement le nom de la mise en page et il affiche tous les identifiants de cette mise en page)

Vous trouverez plus d'informations sur les mises en page et les identifiants ici .

Bon codage,

Évangéliste Chupamobile
la source
2
Quel est le problème de la recherche, disons, ok_buttondans chacune de vos activités? La saisie semi-automatique est encore plus claire de cette façon si vous connaissez le chat que vous recherchez.
Dan Chaltiel
132

Réponse courte: Oui, vous pouvez.

Réponse longue: Vous pouvez le faire car chaque fois que vous utilisez findViewById () pour obtenir une référence à une partie de votre mise en page, la méthode recherche uniquement cette vue dans la mise en page actuellement gonflée. Ainsi, même si vous avez une autre vue avec le même identifiant dans une autre mise en page, Android ne la recherchera pas ici.

Raghav Sood
la source
15
Pouvez-vous donner une réponse encore plus longue? Parce que R.id.layout_id est un entier statique et est prédéterminé au moment de la compilation, findViewById () ne connaîtra pas la disposition actuellement gonflée.
Chloe
22
Pour le bien de tous ceux qui rencontrent cette question, je voulais répondre à la demande de Chloé. L'ID serait le même pour chaque vue, mais n'apparaîtra jamais deux fois dans la même activité. Comme métaphore, considérez ce qui se passerait si je vous donnais une pile de papiers, tous avec un tas de chiffres dessus. Plusieurs de ces feuilles de papier portent le numéro 4. Vous regardez l'une des feuilles et je vous demande d'encercler le 4. C'est facile. Maintenant, vous regardez une autre feuille avec un 4 dessus. Vous pouvez également trouver et encercler cela. Peu importe que le nombre soit défini à l'avance.
Ted Cannelongo
6
Je ne suis pas d'accord avec le commentaire de Ted, vous pouvez avoir en même temps deux composants avec le même ID s'exécutant sur la même activité. Je viens d'avoir le problème sur une application, j'utilisais deux ViewPager différents en même temps dans l'activité principale. Lorsque j'ai essayé de récupérer le ViewPager actuellement affiché avec l'ID, il a en fait récupéré l'autre fonctionnant en arrière-plan. J'ai résolu le problème en rendant simplement les deux identifiants uniques.
Yoann Hercouet le
8
@YoannHercouet Je crois que c'est parce que les deux étaient sur la même feuille (Activité)
Naheel
22

Selon les guides de l'API du développeur:

Un identifiant n'a pas besoin d'être unique dans l'ensemble de l'arbre, mais il doit être unique dans la partie de l'arbre que vous recherchez (qui peut souvent être l'arbre entier, il est donc préférable d'être complètement unique lorsque cela est possible).

Donc, la réponse courte est que ce n'est pas obligatoire, mais c'est une bonne pratique pour éviter d'éventuels conflits.

Alex Epelde
la source
1
Une fois, j'ai créé les mêmes identifiants par accident. Les renommez plus tard était beaucoup de travail car toutes les instances ont été réanimées. Cela signifie qu'une fois que vous avez un conflit d'identité, vous êtes foutu. Ce sera très difficile de tout séparer à nouveau.
t3chb0t le
@ t3chb0t Pour de vrai! Même si vous cochez "local uniquement", Android Studio renomme toutes les instances. C'est absolument ridicule.
John Glen
15

Non recommandé, car si à l'avenir vous devrez refactoriser le view id, Android Studio le refactorisera dans tous les XMLfichiers et classes et vous aurez des ennuis.

Mais il y a aussi des cas où vous devez utiliser la même chose, idpar exemple si vous avez un résumé et que vous réutilisez plusieurs mises en page.

Si vous en avez plusieurs viewsavec le même id'sdans votre projet et que vous avez besoin de refactoriser, faites-le manuellement, n'utilisez pas la fonction de construction dans l'IDE, modifiez le iddans la vue cible à l'intérieur de la XMLmise en page, puis corrigez l'erreur rouge dans la mise en page.

Pavel Poley
la source