Android: usando findViewById () con una stringa / in un loop
-
28-10-2019 - |
Domanda
Sto facendo un'applicazione Android, dove c'è una vista composta da centinaia di pulsanti, ognuno con un callback specifico. Ora, vorrei impostare questi callback usando un ciclo, invece di dover scrivere centinaia di righe di codice (per ciascuno dei pulsanti).
La mia domanda è: come posso usare FindViewById senza dover staticamente digitare ogni ID pulsante? Ecco cosa vorrei fare:
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);
}
}
Grazie in anticipo!
Soluzione
Dovresti usare 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);
}
}
Altri suggerimenti
Puoi provare a creare un int [] che contiene tutti i tuoi ID pulsanti, quindi iterare su quello:
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);
}
Dai un'occhiata a queste risposte:
Puoi usare il tag se si desidera accedere.
in onClick
int i=Integer.parseInt(v.getTag);
Ma non puoi accedere a quel pulsante in questo modo.
Basta creare il pulsante programmaticamente
di Button b=new Button(this);
Crea pulsante personalizzato nel codice Java piuttosto in XML come ho mostrato di seguito
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());
}
}
Se la tua vista di alto livello ha solo quelle viste dei pulsanti come bambini, potresti farlo
for (int i = 0 ; i < yourView.getChildCount(); i++) {
Button b = (Button) yourView.getChildAt(i);
b.setOnClickListener(xxxx);
}
Se ci sono più viste presenti, è necessario verificare se quello selezionato è uno dei tuoi pulsanti.
Se per qualche motivo non puoi usare il getIdentifier()
funzione e/o conosci in anticipo l'ID possibile, è possibile utilizzare un interruttore.
int id = 0;
switch(name) {
case "x":
id = R.id.x;
break;
etc.etc.
}
String value = findViewById(id);