2011-02-01 10 views
48

Estoy haciendo una aplicación para Android, donde hay una vista compuesta por cientos de botones, cada uno con una devolución de llamada específica. Ahora, me gustaría establecer estas devoluciones de llamadas mediante un bucle, en lugar de tener que escribir cientos de líneas de código (para cada uno de los botones).Android: Usando findViewById() con una cadena/en un bucle

Mi pregunta es: ¿Cómo puedo usar findViewById sin tener que escribir estáticamente en cada id de botón? Esto es lo que me gustaría hacer:

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

Gracias de antemano!

Respuesta

81

Simplemente cree Usted debe usar 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); 
    } 
} 
+0

Gracias, eso era lo que estaba buscando. – user573536

+21

"com.sample.project" se puede reemplazar por getPackageName(). – jenzz

+0

Había visto otras respuestas muy similares a esto, pero el segundo argumento era "id" y era lo último que necesitaba para que funcionara. –

3

Usted puede intentar hacer un int [] que contiene todos los ID de botón, y luego iterar sobre que:

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
+1

@ user573536 tenga en cuenta que el uso de 'getResources(). GetIdentifier()' en un bucle puede ocasionar que el rendimiento se degrade cuando tiene una gran cantidad de búsquedas. –

+0

Tienes razón. Recomiendo ese enfoque solo cuando hay una secuencia u orden para los recursos Y hay muchos de ellos (creando una matriz de 50 olores de recursos). – Cristian

1

puede usar la etiqueta si desea acceder.

en onClick

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

Pero usted no puede acceder a ese botón como este.

botón programáticamente

por

0

crear botón personalizado en código Java en lugar de XML como I que se muestra a continuación

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

Si su vista de nivel superior solo tiene esos, pero ton vistas como los niños, que podría hacer

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

Si hay más vistas presentan lo que se necesita para comprobar si el seleccionado es uno de los botones.

+0

¿sabes cómo se compara el rendimiento con los otros métodos sugeridos? Supongo que fue un poco más lento que una serie de ID, pero me gustaría saber cómo se compara con 'getResources(). GetIdentifier()'. –

+0

No lo siento, no tengo idea. Una vista conoce a sus hijos, así que no creo que sea tan malo. –

Cuestiones relacionadas