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);
}
}
Eche un vistazo a estas respuestas:
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);