id
Présentation d' Android
Un Android id
est un entier couramment utilisé pour identifier les vues; cela id
peut être attribué via XML (lorsque cela est possible) et via du code (par programme.) Le id
est le plus utile pour obtenir des références pour les View
s définis par XML générés par un Inflater
(comme en utilisant setContentView
.)
Attribuer id
viaXML
- Ajoutez un attribut de
android:id="@+id/
nom "
à votre vue.
- Lors de la création de votre application, le
android:id
sera attribué un unique int
à utiliser dans le code.
- Référencez votre
android:id
de » int
la valeur en utilisant le code « R.id.
somename »( en fait une constante.)
- cela
int
peut changer de build en build donc ne copiez jamais un id de gen/
package.name/ R.java
, utilisez simplement " R.id.
somename".
- (En outre, un
id
affecté à un Preference
fichier XML n'est pas utilisé lorsque le Preference
génère son View
.)
Attribuer id
via le code (par programme)
- Définissez manuellement
id
s à l'aide de someView.setId(
int);
- Le
int
doit être positif, mais autrement arbitraire - il peut être ce que vous voulez (continuez à lire si c'est effrayant.)
- Par exemple, si vous créez et numérotez plusieurs vues représentant des articles, vous pouvez utiliser leur numéro d'article.
Unicité de id
s
XML
-s attribués id
seront uniques.
- Code attribué
id
s ne pas doivent être uniques
- Les
id
s attribués par code peuvent (théoriquement) entrer en conflit avec les s XML
attribués id
.
- Ces
id
s conflictuels n'auront aucune importance s'ils sont interrogés correctement (continuez à lire) .
Quand (et pourquoi) les conflits id
sont sans importance
findViewById(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ère View
qu'il trouvera avec une correspondance id
.
- Tant qu'il n'y a pas de code
id
assigné avant un XML défini id
dans la hiérarchie, findViewById(R.id.somename)
retournera toujours la vue XML définie ainsi id
.
Dynamiquement Création de vues et attribuer ID
s
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 null onDestroy
. Apparemment , une fuite de la Activity
(agrippent après est détruit) est inutile .. :)
Réserver un XML android:id
pour une utilisation dans le code
Introduction 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
:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item name="reservedNamedId" type="id"/>
</resources>
Ensuite, une fois que le ViewGroup ou la vue a été créé, vous pouvez attacher l'ID personnalisé
myViewGroup.setId(R.id.reservedNamedId);
id
Exemple contradictoire
Pour plus de clarté, à titre d'exemple d'obscurcissement, examinons ce qui se passe en cas de id
conflit dans les coulisses.
layout / mylayout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/placeholder"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
Pour simuler un conflit, disons que notre dernière version a attribué R.id.placeholder
( @+id/placeholder
) une int
valeur de 12
..
Ensuite, MyActivity.java définit certaines vues d'ajout par programme (via le code):
int placeholderId = R.id.placeholder; // placeholderId==12
// returns *placeholder* which has id==12:
ViewGroup placeholder = (ViewGroup)this.findViewById(placeholderId);
for (int i=0; i<20; i++){
TextView tv = new TextView(this.getApplicationContext());
// One new TextView will also be assigned an id==12:
tv.setId(i);
placeholder.addView(tv);
}
Donc, placeholder
et l'un de nos nouveaux TextView
s ont tous les deux un id
de 12! Mais ce n'est pas vraiment un problème si nous interrogeons les vues enfant de l'espace réservé:
// Will return a generated TextView:
placeholder.findViewById(12);
// Whereas this will return the ViewGroup *placeholder*;
// as long as its R.id remains 12:
Activity.this.findViewById(12);
*Pas si mal