81 votes

Comment définir l'identité de la mise en page dynamique créée ?

Je veux donner un ID à certaines vues (textview ,imageview etc) dans une mise en page qui est créée par programme. Quelle est la meilleure façon de définir l'ID ?

133voto

Yugandhar Babu Points 5049

Vous créez un fichier ids.xml et y placez tous vos identifiants requis comme ci-dessous

<?xml version="1.0" encoding="utf-8"?>
<resources>
        <item type="id" name="layout1" />
        <item type="id" name="layout2" />
        <item type="id" name="layout3" />
</resources>

Maintenant, pour vos mises en page ou vues créées dynamiquement, vous pouvez utiliser ces identifiants comme suit

new_layout1.setId(R.id.layout1);
new_view2.setId(R.id.layout2);
new_layout3.setId(R.id.layout3);

J'espère que cela pourra vous aider.

0 votes

C'est ma faute, ça marche. Mais quand même, il n'est jamais bon de ne pas omettre les déclarations d'encodage et de version xml.

19 votes

@Nordvind J'ai donné une idée à abhishek ameta pas une solution complète. Il n'a pas mentionné les exigences de la version d'Android. <?xml ... > est une déclaration de base, donc tout développeur Android écrira dans le fichier *.xml. On m'a dit qu'il fonctionnerait dans toutes les versions d'Android ? Quel est le problème avec mon code ? Si vous avez la même exigence, que vous utilisez ma réponse et que vous avez un problème, demandez-le moi, ne commentez pas comme ça.

1 votes

@Nordvind avec un autre exemple de l'inutilité du système de vote de SO. Dommage qu'il n'y ait pas de moyen de décoter les commentaires.

74voto

vabhatia Points 861

Google a finalement compris la nécessité de générer des ID uniques pour les vues créées par programme...

À partir du niveau 17 de l'API, il est possible d'utiliser la fonction View.generateViewId() comme ça :

view.setId(View.generateViewId());

Pour les applications ciblant le niveau 16 de l'API ou moins, utilisez ViewCompat.generateViewId() à la place :

view.setId(ViewCompat.generateViewId());

6 votes

Vous pouvez également utiliser ViewCompat.generateViewId() si vous visez un niveau d'API inférieur

1 votes

C'est la bonne réponse et la seule dynamique de créer un identifiant.

2 votes

Comment puis-je accéder à l'identifiant que je viens de générer ?

19voto

NagarjunaReddy Points 3638

Créer un dossier res/values/ids.xml et

<?xml version="1.0" encoding="utf-8"?>

<resources>   
   <item name="refresh" type="id"/>   
   <item name="settings" type="id"/>        
</resources>

dans l'appel de la classe d'activité comme ceci

ImageView refreshImg = new ImageView(activity);
ImageView settingsImg = new ImageView(activity); 

     refreshImg.setId(R.id.refresh);
     settingsImg .setId(R.id.settings);

4 votes

Elle a été interrogée sur dynamiquement la mise en page créée.

1 votes

C'est comme ça ---> créer un dossier res/values/ids.xml

15voto

jeet Points 14950

Ça ne marchera pas :

layout.setId(100);

Mais ça, oui :

int id=100;
layout.setId(id);

et aussi celui-ci (crédit : Aaron Dougherty) :

layout.setId(100+1);

0 votes

Comme mentionné ici cette solution générera une erreur de validation de l'éditeur (Expected resource of type id), mais elle compilera sans problème.

4 votes

En fait, ce n'est pas le cas si tu fais int id=100. Apparemment, si tu additionnes des nombres, ça fonctionne bien. Je ne comprends pas ça xD

3 votes

/Merci @MateuszWinnicki, Bizarrement, l'ajout a fait la différence. setId(100) ne fonctionne pas, mais setId(99+1) fonctionne.

9voto

Sanf0rd Points 2472

Pour des raisons de compatibilité, utilisez : ViewCompat.generateViewId()

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