374 votes

Android : View.setID (int id) par programme - comment éviter les conflits d’ID ?

Je suis l’ajout de TextViews par programme dans une boucle for et ajoutez-les à un ArrayList.

Comment utiliser `` ? Quel ID entier je l’invente donc il n’est pas en conflit avec les autres identifiants ?

649voto

xdevelopery Points 2710

Google a enfin pris conscience de la nécessité de générer des Identifiants uniques pour créé par programmation de points de vue...

À partir de l'API de niveau 17 ci-dessus, vous pouvez appeler

Vue.generateViewId()

Ensuite, utilisez la Vue.setId(int).

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, de le mettre dans votre util classe ou quelque part:

private static final AtomicInteger sNextGeneratedId = new AtomicInteger(1);

/**
 * Generate a value suitable for use in {@link #setId(int)}.
 * This value will not collide with ID values generated at build time by aapt for R.id.
 *
 * @return a generated ID value
 */
public static int generateViewId() {
    for (;;) {
        final int result = sNextGeneratedId.get();
        // aapt-generated IDs have the high byte nonzero; clamp to the range under that.
        int newValue = result + 1;
        if (newValue > 0x00FFFFFF) newValue = 1; // Roll over to 1, not 0.
        if (sNextGeneratedId.compareAndSet(result, newValue)) {
            return result;
        }
    }
}

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.)

Dans votre code, vous pouvez le faire:

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {

        myView.setId(Utils.generateViewId());

    } else {

        myView.setId(View.generateViewId());

    }

174voto

Aditya Points 106

Vous pouvez définir ID vous utiliserez plus tard en `` de classe à l’aide d’un fichier de ressources xml et laisser Android SDK à leur donner des valeurs uniques au cours du moment de la compilation.

Pour l’utiliser dans le code :

155voto

Nikolay Ivanov Points 5117

Selon `` documentation

L’identificateur n’a pas à être unique dans la hiérarchie de ce point de vue. L’identificateur 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 l’équivalent de l’id Si vous souhaitez rechercher pour certains vue dans la hiérarchie en appelant au `` avec quelques objets clés peut être très pratique.

62voto

yenliangl Points 574

Ou vous pouvez définir ids.xml dans res/valeurs. Vous pouvez voir un exemple précis dans le code d’échantillon d’android.

samples/ApiDemos/src/com/example/android/apis/RadioGroup1.java samples/ApiDemp/res/values/ids.xml

26voto

dilettante Points 189

Cela fonctionne pour moi:

 static int id = 1;

// Returns a valid id that isn't in use
public int findId(){  
    View v = findViewById(id);  
    while (v != null){  
        v = findViewById(++id);  
    }  
    return id++;  
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X