¿Es posible escribir un bucle for para asignar a los oyentes a muchos botones con la misma función donde se utilizan los últimos?

Estoy escribiendo una aplicación android y tengo 8 botones en una vista que todos tienen la misma función, así que quería asignar la misma funcionalidad a cada botón usando un bucle for en lugar de escribir 8 pedazos de código separado. Sin embargo, surge un problema cuando quiero usar el contador del bucle for dentro de la función onClick para ayudar a despedir una intención, 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. 🙂

EDIT: Este es el error que recibo: No se puede referir 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 los botones están fuera

3 Solutions collect form web for “¿Es posible escribir un bucle for para asignar a los oyentes a muchos botones con la misma función donde se utilizan los últimos?”

Sí, no puede acceder a la variable en sus clases internas si no se declara como final. Solución sencilla será crear OnClickListener clase de contenedor.

 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 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 los botones están en algunos ViewGroup puede utilizar 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); } 

Sólo tienes que cambiar 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!

Si esos botones están decalados en XMl tal vez debería establecer android: onClick listener a ellos a través de XML?

Tienes que definir un método en tu actividad:

 public void myHandler(View v) { // Your stuff... } 

Y añada

 android:onClick="myHandler" 

a todos ellos?

Gracias.

  • Interceptación de clics desde subview en Android
  • ¿Por qué OnClickListener en un ViewHolder no funciona?
  • Botones del diseño de Inflated onClick el oyente no funciona
  • Android: No se puede obtener un encabezado / pie de lista ListView que se puede hacer clic
  • Vista no se puede resolver a un tipo
  • Manejo de eventos táctiles - onInterceptTouchEvent y onTouchEvent
  • No se pudo encontrar un método onClick (View) en la actividad
  • ¿Cómo puedo detectar un clic en el título de ActionBar?
  • La vista inflada no captura el evento onClick
  • Android principiante: toque eventos en android gridview
  • Método onClick no se llama en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.