¿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.
- Android: Evento de clic de botón
- ¿Agregar un onclick a un submenú?
- Botón creado dinámicamente de Android: setOnClickListener no funciona
- TextView onClick () no funciona
- Html onclick disparando dos veces en Android
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.
- No se pudo encontrar un método onClick (View) en la actividad
- Android: ¿Cómo llamar a onTouch sólo después de un onLongClick?
- Cómo ocultar / mostrar el botón en el widget de pantalla de inicio de Android
- Droid: ¿Cómo obtener la identificación del botón del método onClick descrito en XML?
- ¿Cómo abrir el menú deslizante en el evento de clic del botón?
- ¿Cómo hacer efecto bling en textview en clic?
- Evitar que DialogFragment se rechace cuando se hace clic en el botón
- Android: Cómo propagar el evento de clic a los hijos de LinearLayout y cambiar su drawable
¿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?
- ListView de Android con casillas de verificación?
- Actualizar el widget de la aplicación de Android manualmente mediante un botón en el widget