Android: utiliser findViewById () avec une chaîne / en boucle

je fais une application android, où il ya une vue composée de centaines de boutons, chacun avec un rappel spécifique. Maintenant, j'aimerais ensemble de ces rappels à l'aide d'une boucle, au lieu d'avoir à écrire des centaines de lignes de code (pour les boutons).

ma question Est: Comment puis-je utiliser findViewById sans avoir à taper statiquement chaque id de bouton? Voici ce que je voudrais faire:

    for(int i=0; i<some_value; i++) {
       for(int j=0; j<some_other_value; j++) {
        String buttonID = "btn" + i + "-" + j;
        buttons[i][j] = ((Button) findViewById(R.id.buttonID));
        buttons[i][j].setOnClickListener(this);
       }
    }

Merci d'avance!

53
demandé sur Heiko Rupp 2011-02-01 19:35:02

7 réponses

vous devez utiliser getIdentifier()

for(int i=0; i<some_value; i++) {
   for(int j=0; j<some_other_value; j++) {
    String buttonID = "btn" + i + "-" + j;
    int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
    buttons[i][j] = ((Button) findViewById(resID));
    buttons[i][j].setOnClickListener(this);
   }
}
92
répondu WarrenFaith 2016-09-15 07:10:39

vous pouvez essayer de faire un int [] qui tient tous vos ID de bouton, et puis itérer au-dessus de cela:

int[] buttonIDs = new int[] {R.id.button1ID, R.id.button2ID, R.id.button3ID, ... }

for(int i=0; i<buttonIDs.length; i++) {
    Button b = (Button) findViewById(buttonIDs[i]);
    b.setOnClickListener(this);
}
3
répondu Rick Barkhouse 2011-02-01 16:39:57

vous pouvez utiliser tag si vous voulez accéder.

dans onClick

int i=Integer.parseInt(v.getTag);

mais vous ne pouvez pas accéder à ce bouton comme ceci.

il suffit de créer bouton programmatically

par Button b=new Button(this);

1
répondu Ganapathy C 2016-03-10 18:51:51

créer bouton personnalisé en code java plutôt en Xml comme je l'ai montré ci-dessous

Button bs_text[]= new Button[some_value];

    for(int z=0;z<some_value;z++)
        {
            try
            {

            bs_text[z]   =  (Button) new Button(this);

            }
            catch(ArrayIndexOutOfBoundsException e)
            {
                Log.d("ArrayIndexOutOfBoundsException",e.toString());
            }
        }
0
répondu Sankar Ganesh 2011-02-01 16:43:21

si votre vue de haut niveau a seulement ces vues de bouton comme les enfants, vous pouvez faire

for (int i = 0 ; i < yourView.getChildCount(); i++) {
    Button b = (Button) yourView.getChildAt(i);
    b.setOnClickListener(xxxx);
}

S'il y a plus de vues présentes, vous devez vérifier si celle sélectionnée est l'un de vos boutons.

0
répondu Heiko Rupp 2011-02-01 16:55:27

si, pour une raison quelconque, vous ne pouvez pas utiliser la fonction getIdentifier() et/ou que vous connaissez les id possibles à l'avance, vous pouvez utiliser un commutateur.

int id = 0;

switch(name) {
    case "x":
        id = R.id.x;
        break;
    etc.etc.
}

String value = findViewById(id);
0
répondu B.Cakir 2018-04-17 23:08:36