¿Pasar un argumento al llamar a setOnClickListener?

¿Es posible pasar un argumento al oyente cuando se hace clic en un botón:

protected void onCreate(Bundle savedInstanceState) { .... String myArg = "Hello"; Button button1 = (Button)findViewById(R.id.myButton); button1.setOnClickListener(myListener); String myArg = "Goodye"; Button button2 = (Button)findViewById(R.id.myOtherButton); button2.setOnClickListener(myListener); } OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { // print the value from the passed in argument myArg Log.v("TEST", myArg); } }; 

Esto es sólo un ejemplo y no una reflexión sobre lo que realmente quiero hacer, pero sí ilustrar la pregunta.

Básicamente quiero pasar in myArg al oyente de modo que cuando se hace clic en el botón tiene acceso a la variable myArg.

Sé que podría hacer esto como una clase anónima en línea pero tendré porciones de botones y la lógica del tecleo es igual para todos ellos. Necesito el argumento, ya que será diferente para cada botón.

FYI: Mi uso real requiere que el argumento sea un objeto View.

¿Por qué no crear una clase que implementa View.OnClickListener? Esto sería ideal si está reutilizando el código para cada botón también.

 public class MyListener implements View.OnClickListener { private View mView; public MyListener(View v) { mView = v; } @Override public void onClick(View v) { // Use mView here if needed } } 

Y luego usarlo como lo haría normalmente:

 OnClickListener listener = new MyListener(myView); 

Creo que la forma típica en la que se trata este tipo de problema es una prueba de la identificación del objetivo de clic:

 OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { if (v.getId()==R.id.myButton) { // } elseif (v.getId()==R.id.myOtherButton) { // } } }; 

Si eso es insuficiente, puede emplear la propiedad de etiqueta genérica de una vista:

 Button button1 = (Button)findViewById(R.id.myButton); button1.setTag("Hello"); button1.setOnClickListener(myListener); Button button2 = (Button)findViewById(R.id.myOtherButton); button2.setTag("Goodye"); button2.setOnClickListener(myListener); ... OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { // print the value from the passed in argument myArg Log.v("TEST", v.getTag()); } }; 

Y finalmente puede incluso establecer varias etiquetas:

  button1.setTag(R.id.arg1, "Hello"); button1.setTag(R.id.arg2, "World"); 

¿Eso encaja con tus propósitos?

  • Haga clic en el oyente en el botón de Android
  • Descartar Snackbar A la izquierda deslizar
  • Eliminar un detector de onclick
  • ¿Cómo comprobar si la casilla de verificación android está marcada dentro de su método onClick (declarado en XML)?
  • Cómo obtener el identificador de elemento en un controlador onItemClick
  • La forma más fácil de tener el botón de abrir el navegador a la URL específica
  • OnClickListener en TranslateAnimation
  • Phonegap 2.4.0 con Android 4.2 - comportamiento de doble clic extraño
  • cambiar el color de fondo de ListView desactiva el color de resaltado
  • ¿Cómo implementar onclick en javascript y html para dispositivos con versiones inferiores de android?
  • Cómo borrar el edittext cuando onclick en el botón
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.