idPrésentation d' Android
Un Android idest un entier couramment utilisé pour identifier les vues; cela idpeut être attribué via XML (lorsque cela est possible) et via du code (par programme.) Le idest le plus utile pour obtenir des références pour les Views définis par XML générés par un Inflater(comme en utilisant setContentView.)
Attribuer idviaXML
- Ajoutez un attribut de
android:id="@+id/nom "à votre vue.
- Lors de la création de votre application, le
android:idsera attribué un unique int à utiliser dans le code.
- Référencez votre
android:idde » intla valeur en utilisant le code « R.id.somename »( en fait une constante.)
- cela
intpeut 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
idaffecté à un Preferencefichier XML n'est pas utilisé lorsque le Preferencegénère son View.)
Attribuer idvia le code (par programme)
- Définissez manuellement
ids à l'aide de someView.setId(int);
- Le
intdoit ê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 ids
XML-s attribués idseront uniques.
- Code attribué
ids ne pas doivent être uniques
- Les
ids attribués par code peuvent (théoriquement) entrer en conflit avec les s XMLattribués id.
- Ces
ids conflictuels n'auront aucune importance s'ils sont interrogés correctement (continuez à lire) .
Quand (et pourquoi) les conflits idsont 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 Viewqu'il trouvera avec une correspondance id.
- Tant qu'il n'y a pas de code
idassigné avant un XML défini iddans la hiérarchie, findViewById(R.id.somename)retournera toujours la vue XML définie ainsi id.
Dynamiquement Création de vues et attribuer IDs
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:idpour 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 ViewGroupne 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);
idExemple contradictoire
Pour plus de clarté, à titre d'exemple d'obscurcissement, examinons ce qui se passe en cas de idconflit 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 intvaleur 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, placeholderet l'un de nos nouveaux TextViews ont tous les deux un idde 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