Comment puis-je attribuer un ID à vue par programmation?
Dans un fichier XML, nous pouvons attribuer un ID à une vue comme android:id="@+id/something"
et ensuite appeler findViewById()
, mais lors de la création d'un point de vue de la programmation, comment puis-je attribuer un ID?
Je pense que setId()
n'est pas le même que l'affectation par défaut. setId()
est extra.
Quelqu'un peut me corriger?
- Sous-ensemble: comment générer des Identifiants uniques: stackoverflow.com/questions/1714297/...
Vous devez vous connecter pour publier un commentaire.
Android
id
aperçuAndroid
id
est un entier couramment utilisé pour identifier les points de vue; ceid
peut être affecté à l'aide XML (si possible) et via le code (par programmation.) Leid
est le plus utile pour obtenir des références pour XML définiView
s généré par unInflater
(en utilisant par exemple dessetContentView
.)Attribuer
id
viaXML
android:id="@+id/
abc"
à votre vue.android:id
sera attribué un uniqueint
pour les utiliser dans le code.android:id
'sint
valeur dans le code à l'aide de "R.id.
abc" (en fait, une constante.)int
pouvez modifier à partir de construire de construire donc ne jamais copier un id degen/
paquet.nom/R.java
, il suffit d'utiliser "R.id.
abc".id
attribué à unPreference
en XML n'est pas utilisé lorsque lePreference
génère sonView
.)Attribuer
id
via le code (par programmation)id
s à l'aide desomeView.setId(
int);
int
doit être positive, mais sinon arbitraire, il peut être ce que vous voulez (continuez à lire si c'est affreux.)Unicité de
id
sXML
attribuéid
s sera unique.id
s ne pas être uniqueid
s peut (théoriquement) en conflit avecXML
attribuéid
s.id
s n'a pas d'importance si une demande est effectuée correctement (continuer à lire).Quand (et pourquoi) contradictoires
id
s n'a pas d'importancefindViewById(int)
va se répéter profondeur d'abord de manière récursive à travers le point de vue de la hiérarchie de la Vue que vous spécifiez et de retour de la premièreView
il trouve une correspondanceid
.id
s assigné devant un XML définiid
dans la hiérarchie,findViewById(R.id.somename)
renverra toujours le XML défini par la Vue alorsid
'd.Dynamiquement de la Création de Vues et l'Attribution
ID
sViewGroup
avecid
.LinearLayout
avecandroid:id="@+id/placeholder"
.ViewGroup
avecView
s.id
s qui conviennent à chaque vue.Requête de l'enfant ces points de vue à l'aide de l'espace réservé.findViewById(convenientInt);
API 17 introduit
View.generateViewId()
qui vous permet de générer un ID unique.Si vous choisissez de conserver les références à vos points de vue autour de, assurez-vous de les instancier avec
getApplicationContext()
et assurez-vous de définir chaque référence à la valeur null dansonDestroy
. Apparemment fuite laActivity
(accroché à elle après est détruit), c'est du gaspillage.. 🙂Réserver un XML
android:id
pour les utiliser dans le codeAPI 17 introduit
View.generateViewId()
qui génère un IDENTIFIANT unique. (Merci à prendre des-chances-de-faire-des modifications pour le rappeler.)*Si votre
ViewGroup
ne peut pas être définie par XML (ou vous ne voulez pas qu'il soit), vous pouvez réserver l'id via XML, afin de s'assurer qu'elle reste unique:Ici, values/ids.xml définit une coutume
id
:Puis, une fois les ViewGroup ou de point de Vue a été créé, vous pouvez joindre l'id personnalisé
Contradictoires
id
exemplePour plus de clarté par voie d'obfusquer exemple, permet d'examiner ce qui se passe quand il y a un
id
conflit en coulisses.layout/mylayout.xml
Pour simuler un conflit, permet de dire que notre dernière version affecté
R.id.placeholder
(@+id/placeholder
) unint
valeur de12
..Prochaine, MyActivity.java définit certaines ajoute vues par programme (via le code):
Donc
placeholder
et l'un de nos nouveauxTextView
s les deux ont unid
de 12! Mais ce n'est pas vraiment un problème si nous requête espace réservé à l'enfant de vues:*Pas si mal
findViewById
n'profondeur d'abord de l'exploration, de sorte que "tant Qu'il n'y a pas de code attribué id ci-dessus XML-id défini dans la hiérarchie" n'est pas techniquement correct; c'est "avant" plutôt que "au-dessus".ids.xml
. Pour vraiment arbitraire ID, utilisezView.generateViewId()
API (17). (Merci de préciser votre point si je l'ai raté.)Vous pouvez simplement utiliser le
View.setId(integer)
pour cela. Dans le XML, même si vous êtes en paramètre une Chaîne de caractères id, il s'est converti en un entier. Pour cette raison, vous pouvez utiliser n'importe quel (positif) Entier pour leViews
vous ajouter par programmation.Crédits à cette réponse.
Oui, vous pouvez appeler
setId(value)
dans n'importe quelle vue avec tout (positif) valeur entière que vous aimez et ensuite le trouver dans le conteneur parent à l'aide defindViewById(value)
. Notez qu'il est valide d'appelsetId()
avec la même valeur pour les différentes, de frère, de points de vue, maisfindViewById()
sera de retour que le premier.findViewById
sur un ancêtre, c'est une bonne idée pour des raisons de performances, mais cela ne garantit pas qu'il va trouver immédiatement un enfant si il y en a un avec l'ID correct.