Je fais une application Android, où il y a une vue composée de centaines de boutons, chacun avec un rappel spécifique. Maintenant, j'aimerais définir ces callbacks en utilisant une boucle, au lieu d'avoir à écrire des centaines de lignes de code (pour chacun des boutons).
Ma question est la suivante: comment utiliser findViewById sans avoir à taper statiquement chaque ID de bouton? Voici ce que j'aimerais 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!
Vous devriez 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);
}
}
Vous pouvez essayer de créer un int [] contenant tous vos identifiants de bouton, puis itérer dessus:
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);
}
vous pouvez utiliser tag si vous souhaitez y accéder.
en onClick
int i=Integer.parseInt(v.getTag);
Mais vous ne pouvez pas accéder à ce bouton comme ça.
il suffit de créer un bouton par programmation
par Button b=new Button(this);
Si pour une raison quelconque vous ne pouvez pas utiliser la fonction getIdentifier()
et/ou si vous connaissez les identifiants 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);
créer un bouton personnalisé en code Java plutôt qu'en XML, comme indiqué 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());
}
}
Si votre vue de niveau supérieur n'a que ces vues de bouton en tant qu'enfants, vous pouvez le 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 devrez vérifier si celle sélectionnée est l'un de vos boutons.