¿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.
- Cerrar Spinner en clic fuera de Spinner
- ¿Cómo puedo detectar un clic en el título de ActionBar?
- Realizar el botón Acción en Haga clic en Notificación personalizada: Android
- Cómo obtener OnClick () de los botones agregados mediante programación?
- Bloqueo de onClick de Android enFling
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.
- Android listview obtiene el elemento seleccionado
- Onlclick oyente no está funcionando correctamente ..?
- Descartar Snackbar A la izquierda deslizar
- Toast dentro del método onClick en Fragment
- Botón setonclicklistener error
- Android MediaPlayer Singleton
- OnItemClickListener consume eventos onClickListener
- Evento onClick no está desencadenando | Androide
¿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