¿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?

  • Cómo establecer un listener de onclick para un imagebutton en un alertdialog
  • OnClickListener no se puede resolver a un tipo (Eclipse)
  • Usando onClick en TextView con texto seleccionable - cómo evitar doble clic?
  • Android cómo escribir clic evento de un ImageView
  • Android: Evento de clic de botón
  • Vista no se puede resolver a un tipo
  • Establecer OnClickListener para elementos en ListView con 2 vistas
  • Android: El botón OnClickListener no funciona
  • Cajón de navegación Elementos que no registran el evento de clic
  • Android.os.FileUriExposedException: file.jpg expuesto más allá de la aplicación a través de ClipData.Item.getUri ()
  • No se pudo encontrar un método onClick (View) en la clase de actividad android.view.ContextThemeWrapper para onClick handler
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.