J'ajoute TextViews par programme dans une boucle for et je les ajoute à une liste de tableaux.
Comment est-ce que j'utilise TextView.setId(int id)
? Quel ID entier dois-je trouver pour qu'il n'entre pas en conflit avec d'autres ID?
J'ajoute TextViews par programme dans une boucle for et je les ajoute à une liste de tableaux.
Comment est-ce que j'utilise TextView.setId(int id)
? Quel ID entier dois-je trouver pour qu'il n'entre pas en conflit avec d'autres ID?
Selon la View
documentation
L'identifiant n'a pas besoin d'être unique dans la hiérarchie de cette vue. L'identifiant doit être un nombre positif.
Vous pouvez donc utiliser n'importe quel entier positif que vous aimez, mais dans ce cas, il peut y avoir des vues avec des identifiants équivalents. Si vous souhaitez rechercher une vue dans la hiérarchie, appeler setTag
avec certains objets clés peut être pratique.
findViewById
des garanties quant à la vue qui est retournée s'il y en a plusieurs avec le même ID? Les documents ne mentionnent rien.findViewById
, le premier sera trouvé.setContentView()
a, disons, 10 vues avec leur identifiant défini sur le même numéro d'identification dans la même hiérarchie , alors un appel àfindViewById([repeated_id])
retournerait le premier ensemble de vues avec cet identifiant répété. C'est ce que je voulais dire.Depuis l'API de niveau 17 et supérieur, vous pouvez appeler: View.generateViewId ()
Utilisez ensuite View.setId (int) .
Si votre application est ciblée à un niveau inférieur au niveau 17 de l'API, utilisez ViewCompat.generateViewId ()
la source
AtomicInteger
implémentation des méthodes.for(;;)
je n'ai jamais vu ça auparavant. Comment ça s'appelle?Vous pouvez définir les identifiants que vous utiliserez plus tard en
R.id
classe à l'aide d'un fichier de ressources xml et laisser le SDK Android leur donner des valeurs uniques lors de la compilation.Pour l'utiliser dans le code:
la source
"int currentId = 1000; whateverView.setId(currentId++);
- Cela incrémente l'ID à chaquecurrentId++
utilisation, garantissant un ID unique, et je peux stocker le ID dans ma liste de tableaux pour un accès ultérieur.<resources>
.Vous pouvez également définir
ids.xml
dansres/values
. Vous pouvez voir un exemple exact dans l'exemple de code d'Android.la source
Depuis l'API 17, la
View
classe a une méthode statiquegenerateViewId()
quila source
Cela fonctionne pour moi:
la source
findViewById()
est une opération lente. L'approche fonctionne, mais au détriment des performances.(C'était un commentaire à la réponse de dilettante mais ça devenait trop long ... hehe)
Bien sûr, une statique n'est pas nécessaire ici. Vous pouvez utiliser SharedPreferences pour enregistrer, au lieu de statique. Quoi qu'il en soit, la raison est de sauvegarder la progression actuelle afin qu'elle ne soit pas trop lente pour les mises en page compliquées. Car, en fait, après son utilisation une fois, ce sera plutôt rapide plus tard. Cependant, je ne pense pas que ce soit une bonne façon de le faire, car si vous devez reconstruire votre écran (par exemple, il
onCreate
est rappelé), vous voudrez probablement recommencer depuis le début de toute façon, éliminant le besoin de statique. Par conséquent, faites-en simplement une variable d'instance au lieu de statique.Voici une version plus petite qui s'exécute un peu plus rapidement et pourrait être plus facile à lire:
Cette fonction ci-dessus devrait être suffisante. Parce que, pour autant que je sache, les identifiants générés par Android sont des milliards, donc cela reviendra probablement
1
la première fois et sera toujours assez rapide. Parce que, en fait, il ne dépassera pas les ID utilisés pour en trouver un inutilisé. Cependant, la boucle est là si elle trouve réellement un ID utilisé.Cependant, si vous souhaitez toujours enregistrer la progression entre les recréations suivantes de votre application et éviter d'utiliser de l'électricité statique. Voici la version SharedPreferences:
Cette réponse à une question similaire devrait vous dire tout ce que vous devez savoir sur les identifiants avec Android: https://stackoverflow.com/a/13241629/693927
EDIT / FIX: Je viens de réaliser que j'ai complètement raté la sauvegarde. Je devais être ivre.
la source
La bibliothèque 'Compat' prend désormais également en charge la
generateViewId()
méthode pour les niveaux d'API antérieurs à 17.Assurez-vous simplement d'utiliser une version de la
Compat
bibliothèque qui est27.1.0+
Par exemple, dans votre
build.gradle
fichier, mettez:implementation 'com.android.support:appcompat-v7:27.1.1
Ensuite, vous pouvez simplement utiliser le
generateViewId()
de laViewCompat
classe au lieu de laView
classe comme suit://Will assign a unique ID myView.id = ViewCompat.generateViewId()
Bon codage!
la source
Juste un ajout à la réponse de @phantomlimb,
bien que
View.generateViewId()
nécessite un niveau API> = 17,cet outil est compatible avec toutes les API.
selon le niveau d'API actuel,
il décide de la météo en utilisant ou non l'API du système.
afin que vous puissiez utiliser
ViewIdGenerator.generateViewId()
etView.generateViewId()
en même temps et ne vous inquiétez pas d'obtenir le même identifiantla source
for (;;) { … }
provient du code source Android.generateViewId()
else { return View.generateViewId(); }
cela ira en boucle infinie pour un niveau api inférieur à 17 appareils?Afin de générer dynamiquement le formulaire ID de vue, utilisez l'API 17
generateViewId ()
Ce qui générera une valeur appropriée pour une utilisation dans
setId(int)
. Cette valeur n'entrera pas en collision avec les valeurs d'ID générées au moment de la construction par aapt pourR.id
.la source
...
la source
J'utilise:
En utilisant un nombre aléatoire, j'ai toujours une énorme chance d'obtenir l'identifiant unique lors de la première tentative.
la source
la source
Mon choix:
la source