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!

È stato utile?

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);
}

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top