switch studio has event clicked android button for-loop android-intent onclick

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!