studio - onclick android event
¿Es posible escribir un bucle for para asignar oyentes a muchos botones con la misma función donde se usan los ints finales? (3)
Sí, no puede acceder a la variable en sus clases internas si no se declara como definitiva. Una solución simple será crear una clase contenedora OnClickListener.
private class MyListener implements Button.OnClickListener {
int pos;
public MyListener (int position) {
pos = position;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent getContactIntent = new Intent(Intent.ACTION_PICK,ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(getContactIntent, pos);
}
}
y luego usarlo en tu código como este
//for loop to assign same functionality to buttons in pickPlayers array
for(int i = 0; i<pickPlayers.length; i++){
b = (Button) findViewById(pickPlayers[i]);
b.setOnClickListener(new MyListener(i));
}
Además, si sus botones están en algún ViewGroup, puede usar getChildAt y getChildCount para iterarlos
ViewGroup parent;
// initialize the parent
int l = parent.getChildCount();
for (int i = 0 ; i < l ; i++) {
Button button = parent.getChildAt(i);
}
Estoy escribiendo una aplicación para Android y tengo 8 botones en una vista que tienen la misma función, así que quería asignar la misma funcionalidad a cada botón usando un ciclo for en lugar de escribir 8 pedazos de código por separado. Sin embargo, surge un problema cuando quiero usar el contador del bucle for dentro de la función onClick para ayudar a activar un intento, aquí está el código:
//array of button ids
public int [] pickPlayers = { R.id.pick_player_1a, R.id.pick_player_2a, R.id.pick_player_3a, R.id.pick_player_4a, R.id.pick_player_1b, R.id.pick_player_2b, R.id.pick_player_3b, R.id.pick_player_4b};
//button to be used in for loop
public Button b;
//for loop to assign same functionality to buttons in pickPlayers array
for(int i = 0; i<pickPlayers.length; i++){
b = (Button) findViewById(pickPlayers[i]);
b.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent getContactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(getContactIntent, i);
}
});
};
Espero que todo tenga sentido, gracias a cualquiera que pueda ayudar. :)
EDITAR: Este es el error que obtengo: No puedo hacer referencia a una variable no final i dentro de una clase interna definida en un método diferente
El bucle for está en mi método oncreate, las variables y botones están afuera
Si esos botones están degradados en XMl, quizás debas configurar android: on¿Haz clic en ellos a través de XML?
Debes definir un método en tu actividad:
public void myHandler(View v) {
// Your stuff...
}
Y añadir
android:onClick="myHandler"
a todos ellos?
Gracias.
Solo cambia tu código así:
//for loop to assign same functionality to buttons in pickPlayers array
for(int i = 0; i<pickPlayers.length; i++){
final int index = i;
b = (Button) findViewById(pickPlayers[i]);
b.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent getContactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(getContactIntent, index);
}
});
};
Esto debería hacer el trabajo. ¡Buena suerte!