Programmatique Vue sur la façon de définir les id unique?
Je crée dans mon appli tas de programmatiques View
s. Comme il semble qu'ils soient tous par défaut ont la même id=-1
. Afin de travailler avec eux, j'ai besoin de générer des id unique.
J'ai essayé plusieurs approches en matière de génération de nombre aléatoire et en fonction de l'heure, mais de toute façon il n'y a pas de garantie à 100% que différents points de Vue sera différent de l'id de
Me demandais est-il un moyen plus fiable pour générer spécifiques? Il y a probablement de la méthode spéciale/classe?
- Je pense que la meilleure façon est de garder un int compteur et d'un incrément lorsque vous ajoutez un point de vue et le définir comme id
- Double Possible de Android: point de Vue.setID(int id) par programme - comment éviter le conflit d'ID?
Vous devez vous connecter pour publier un commentaire.
Juste un complément à la réponse de @phantomlimb,
tout
View.generateViewId()
besoin de l'API de Niveau >= 17,cet outil est compatibe avec toutes les API.
le courant de l'API de Niveau
il décide de la météo à l'aide de l'API système ou pas.
de sorte que vous pouvez utiliser
ViewIdGenerator.generateViewId()
etView.generateViewId()
dans leen même temps, et ne vous souciez pas des mêmes id
ViewIdGenerator.generateViewId()
etView.generateViewId()
de façon interchangeable, ce qui signifie de Construire.VERSION.SDK_INT >= 17 ,de sorte que le codeif (Build.VERSION.SDK_INT < 17) {…}
ne sera jamais exécuté. en fait, il toujours utiliserView.generateViewId()
dans ce cas. 🙂generateViewId()
..View.generateViewId()
a rien commereset
, cet extrait de code n'ont pasVeux juste ajouter à Kaj réponse, à partir de l'API de niveau 17, vous pouvez appeler
Vue.generateViewId()
puis utilisation de la Vue.setId(int) de la méthode.
Dans le cas où vous en avez besoin pour les cibles de niveau inférieur au 17, ici, c'est sa mise en œuvre en interne View.java vous pouvez utiliser directement dans votre projet:
Numéro d'identification de plus de 0x00FFFFFF est réservé pour des vues statiques définies dans le /res des fichiers xml. (Le plus probable 0x7f****** à partir de la R.java dans mes projets.)
À partir du code, en quelque sorte, Android ne veut pas que vous utiliser 0 comme un affichage de l'id, et il doit être retourné avant 0x01000000 pour éviter les conflits avec statique Id de ressource.
generateViewId
..Créer une classe singleton, qui a atomique Entier. La bosse de l'entier, et renvoie la valeur lorsque vous avez besoin d'une identification.
L'id est unique au cours de l'exécution de vos processus, mais wil réinitialisation lors de votre processus est redémarré.
Noter que le code peut ne pas être unique, si il y a déjà des vues qui ont des id dans la vue "graphe". Vous pouvez essayer de démarrer avec un nombre Entier.MAX_VALUE, et de diminuer au lieu d'aller à partir de 1 -> MAX_VALUE
Depuis la bibliothèque de prise en charge 27.1.0 il y a generateViewId() dans ViewCompat
ViewCompat.generateViewId()
Concernant la solution de repli pour les API<17, je vois que les solutions proposées commencer à générer des Identifiants à partir de 0 ou 1. La classe de la Vue est un autre exemple de générateur, et aussi commence à compter à partir de numéro un, qui permettra à la fois de vous et de la Vue du générateur de générer le même Id, et vous finirez par avoir des Vues différentes avec le même Id de votre point de Vue de la hiérarchie. Il n'est malheureusement pas une bonne solution, mais c'est un hack qui devrait être bien documenté: