studio programacion herramientas fundamentos con avanzado aplicaciones android button clicklistener

programacion - manual de android en pdf



Android: utilizando findViewById() con una cadena/en un bucle (7)

Estoy haciendo una aplicación para Android, donde hay una vista compuesta de 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).

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 por adelantado!


Deberías 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); } }



Puede intentar hacer un int [] que contenga todos sus ID de botón, y luego iterar sobre eso:

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


Si por alguna razón no puede usar la función getIdentifier() y / o conoce las posibles identificaciones de antemano, podría usar un interruptor.

int id = 0; switch(name) { case "x": id = R.id.x; break; etc.etc. } String value = findViewById(id);


Si su vista de nivel superior solo tiene esas vistas de botón como elementos secundarios, 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 presentes, deberá verificar si el seleccionado es uno de sus botones.


crear un botón personalizado en código java en lugar de Xml como 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()); } }


puede usar la etiqueta si desea acceder.

en onClick

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

Pero no puedes acceder a ese botón de esta manera.

simplemente crea el botón programáticamente

por Button b=new Button(this);