Dans un fichier XML, nous pouvons attribuer un ID à une vue similaire android:id="@+id/something"
, puis appeler findViewById()
, mais lors de la création d'une vue par programme, comment attribuer un ID?
Je pense que ce setId()
n'est pas la même chose que l'affectation par défaut. setId()
est extra.
Quelqu'un peut-il me corriger?
Réponses:
id
Présentation d' AndroidUn Android
id
est un entier couramment utilisé pour identifier les vues; celaid
peut être attribué via XML (lorsque cela est possible) et via du code (par programme.) Leid
est le plus utile pour obtenir des références pour lesView
s définis par XML générés par unInflater
(comme en utilisantsetContentView
.)Attribuer
id
viaXML
android:id="@+id/
nom"
à votre vue.android:id
sera attribué un uniqueint
à utiliser dans le code.android:id
de »int
la valeur en utilisant le code «R.id.
somename »( en fait une constante.)int
peut changer de build en build donc ne copiez jamais un id degen/
package.name/R.java
, utilisez simplement "R.id.
somename".id
affecté à unPreference
fichier XML n'est pas utilisé lorsque lePreference
génère sonView
.)Attribuer
id
via le code (par programme)id
s à l'aide desomeView.setId(
int);
int
doit être positif, mais autrement arbitraire - il peut être ce que vous voulez (continuez à lire si c'est effrayant.)Unicité de
id
sXML
-s attribuésid
seront uniques.id
s ne pas doivent être uniquesid
s attribués par code peuvent (théoriquement) entrer en conflit avec les sXML
attribuésid
.id
s conflictuels n'auront aucune importance s'ils sont interrogés correctement (continuez à lire) .Quand (et pourquoi) les conflits
id
sont sans importancefindViewById(int)
itérera la profondeur en premier de manière récursive dans la hiérarchie des vues à partir de la vue que vous spécifiez et retournera la premièreView
qu'il trouvera avec une correspondanceid
.id
assigné avant un XML définiid
dans la hiérarchie,findViewById(R.id.somename)
retournera toujours la vue XML définie ainsiid
.Dynamiquement Création de vues et attribuer
ID
sViewGroup
avecid
.LinearLayout
avecandroid:id="@+id/placeholder"
.ViewGroup
avecView
s.id
s qui conviennent à chaque vue.Recherchez ces vues enfant à l'aide de placeholder.findViewById (convenientInt);
Introduction de l'API 17
View.generateViewId()
qui vous permet de générer un ID unique.Si vous choisissez de conserver les références à vos vues , assurez-vous de les instancier avec
getApplicationContext()
et assurez-vous de définir chaque référence sur nullonDestroy
. Apparemment , une fuite de laActivity
(agrippent après est détruit) est inutile .. :)Réserver un XML
android:id
pour une utilisation dans le codeIntroduction de l'API 17
View.generateViewId()
qui génère un ID unique. (Merci à take-chances-make-changes de l'avoir signalé.) *Si votre
ViewGroup
ne peut pas être défini via XML (ou si vous ne le souhaitez pas), vous pouvez réserver l'id via XML pour vous assurer qu'il reste unique:Ici, values / ids.xml définit une coutume
id
:Ensuite, une fois que le ViewGroup ou la vue a été créé, vous pouvez attacher l'ID personnalisé
id
Exemple contradictoirePour plus de clarté, à titre d'exemple d'obscurcissement, examinons ce qui se passe en cas de
id
conflit dans les coulisses.layout / mylayout.xml
Pour simuler un conflit, disons que notre dernière version a attribué
R.id.placeholder
(@+id/placeholder
) uneint
valeur de12
..Ensuite, MyActivity.java définit certaines vues d'ajout par programme (via le code):
Donc,
placeholder
et l'un de nos nouveauxTextView
s ont tous les deux unid
de 12! Mais ce n'est pas vraiment un problème si nous interrogeons les vues enfant de l'espace réservé:*Pas si mal
la source
findViewById
fait une exploration en profondeur, donc "Tant qu'il n'y a pas d'ID assigné par code assigné au-dessus d'un ID défini par XML dans la hiérarchie" n'est pas techniquement correct; c'est "avant" plutôt que "dessus".ids.xml
. Pour des ID vraiment arbitraires, utilisezView.generateViewId()
(API 17). (Veuillez clarifier votre point si je l'ai manqué.)PreferenceDialogFragmentCompat
semble que les identifiants deR.id
ne correspondent pas à la hiérarchie des vues. De cette façon, je ne trouve pas la vue par ID.Vous pouvez simplement utiliser le
View.setId(integer)
pour cela. Dans le XML, même si vous définissez un identifiant de chaîne, celui-ci est converti en entier. Pour cette raison, vous pouvez utiliser n'importe quel entier (positif) pour l'Views
ajouter par programme.Crédits à cette réponse .
la source
Oui, vous pouvez appeler
setId(value)
dans n'importe quelle vue avec n'importe quelle valeur entière (positive) que vous aimez, puis la trouver dans le conteneur parent en utilisantfindViewById(value)
. Notez qu'il est valide d'appelersetId()
avec la même valeur pour différentes vues de frère, maisfindViewById()
ne renverra que la première.la source
findViewById
à un ancêtre connu est une bonne idée pour des raisons de performances, mais cela ne garantit pas qu'il trouvera un enfant immédiat s'il y en a un avec l'ID correct.