Android OnClickListener – identificar un botón

Oye. Tengo la actividad:

public class Mtest extends Activity { Button b1; Button b2; public void onCreate(Bundle savedInstanceState) { ... b1 = (Button) findViewById(R.id.b1); b2 = (Button) findViewById(R.id.b2); b1.setOnClickListener(myhandler); b2.setOnClickListener(myhandler); ... } View.OnClickListener myhandler = new View.OnClickListener() { public void onClick(View v) { // MY QUESTION STARTS HERE!!! // IF b1 do this // IF b2 do this // MY QUESTION ENDS HERE!!! } } } 

¿Cómo puedo comprobar qué botón se ha hecho clic?

Usted aprenderá la manera de hacerlo, de una manera fácil, es:

 public class Mtest extends Activity { Button b1; Button b2; public void onCreate(Bundle savedInstanceState) { ... b1 = (Button) findViewById(R.id.b1); b2 = (Button) findViewById(R.id.b2); b1.setOnClickListener(myhandler1); b2.setOnClickListener(myhandler2); ... } View.OnClickListener myhandler1 = new View.OnClickListener() { public void onClick(View v) { // it was the 1st button } }; View.OnClickListener myhandler2 = new View.OnClickListener() { public void onClick(View v) { // it was the 2nd button } }; } 

O, si está trabajando con sólo un clicklistener, puede hacer lo siguiente:

 View.OnClickListener myOnlyhandler = new View.OnClickListener() { public void onClick(View v) { switch(v.getId()) { case R.id.b1: // it was the first button break; case R.id.b2: // it was the second button break; } } } 

Aunque, no recomiendo hacerlo de esa manera ya que tendrá que agregar un if por cada botón que utilice. Eso es difícil de mantener.

O puedes probar lo mismo pero sin oyentes. En la definición de botón XML:

 android:onClick="ButtonOnClick" 

Y en su código defina el método ButtonOnClick :

 public void ButtonOnClick(View v) { switch (v.getId()) { case R.id.button1: doSomething1(); break; case R.id.button2: doSomething2(); break; } } 

Yo prefiero:

 class MTest extends Activity implements OnClickListener { public void onCreate(Bundle savedInstanceState) { ... Button b1 = (Button) findViewById(R.id.b1); Button b2 = (Button) findViewById(R.id.b2); b1.setOnClickListener(this); b2.setOnClickListener(this); ... } 

Y entonces:

 @Override public void onClick(View v) { switch (v.getId()) { case R.id.b1: .... break; case R.id.b2: .... break; } } 

Switchcase es más fácil de mantener que ifelse , y esta implementación no requiere hacer muchas variables de clase.

Si no quieres guardar instancias del botón 2 en el código de la clase, sigue este camino MEJOR (¡esto es más claro y rápido !!):

 public void buttonPress(View v) { switch (v.getId()) { case R.id.button_one: // do something break; case R.id.button_two: // do something else break; case R.id.button_three: // i'm lazy, do nothing break; } } 

Cinco maneras de conectar un oyente de eventos es un gran artículo que revisa las diversas maneras de configurar un solo oyente de eventos. Permítanme ampliar eso aquí para múltiples oyentes.

1. Clase Miembro

 public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //attach an instance of HandleClick to the Button HandleClick handleClick = new HandleClick(); findViewById(R.id.button1).setOnClickListener(handleClick); findViewById(R.id.button2).setOnClickListener(handleClick); } private class HandleClick implements OnClickListener{ public void onClick(View view) { switch(view.getId()) { case R.id.button1: // do stuff break; case R.id.button2: // do stuff break; } } } } 

2. Tipo de interfaz

 public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button1).setOnClickListener(handleClick); findViewById(R.id.button2).setOnClickListener(handleClick); } private OnClickListener handleClick = new OnClickListener() { public void onClick(View view) { switch (view.getId()) { case R.id.button1: // do stuff break; case R.id.button2: // do stuff break; } } }; } 

3. Clase interna anónima

 public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button1).setOnClickListener(new OnClickListener() { public void onClick(View view) { // do stuff } }); findViewById(R.id.button2).setOnClickListener(new OnClickListener() { public void onClick(View view) { // do stuff } }); } } 

4. Implementación en la Actividad

 public class main extends Activity implements OnClickListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); } public void onClick(View view) { switch (view.getId()) { case R.id.button1: // do stuff break; case R.id.button2: // do stuff break; } } } 

5. Atributo en el diseño de vistas para eventos OnClick

 public class main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void HandleClick(View view) { switch (view.getId()) { case R.id.button1: // do stuff break; case R.id.button2: // do stuff break; } } } 

Y en xml:

 <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="HandleClick" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="HandleClick" /> 

Otra manera de hacerlo es un solo oyente de la actividad, como esto:

 public class MyActivity extends Activity implements OnClickListener { ....... code //my listener @Override public void onClick(View v) { if (v.getId() == R.id.mybutton) { DoSomething(); return; } if (v.getId() == R.id.mybutton2) { DoSomething2(); return; } } } 

Me gusta hacerlo con un solo IF en lugar de switch-else, pero si lo prefiere, entonces usted debe hacer:

 //my listener @Override public void onClick(View v) { switch(v.getId()) { case R.id.mybutton: { DoSomething(); break; } case R.id.mybutton2: { DoSomething(); break; } } } 

La mejor manera es cambiando entre v.getId (). Tener OnClickListener anónimo por separado para cada botón está ocupando más memoria. No es necesario ver el botón Casting View. Usar if-else cuando el interruptor es posible es más lento y más difícil de leer. En la fuente de Android a menudo se puede notar comparando las referencias por if-else:

 if (b1 == v) { // ... } else if (b2 == v) { 

No sé exactamente por qué eligieron esta manera, pero funciona también.

Use setTag ();

Me gusta esto:

 @Override public void onClick(View v) { int tag = (Integer) v.getTag(); switch (tag) { case 1: System.out.println("button1 click"); break; case 2: System.out.println("button2 click"); break; } } 

Además de la respuesta de Cristian C (lo siento, no tengo la capacidad de hacer comentarios), si usted hace un manejador para ambos botones, puede comparar directamente v a b1 y b2, o si desea comparar por el ID, usted No es necesario lanzar v en Button (View has getId () método, también), y de esa manera no hay preocupación de la excepción de cast.

 Button mybutton = new Button(ViewPagerSample.this); mybutton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub } }); 
 Button button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(this); @Override public void onClick(View v) { // TODO Auto-generated method stub if(v.getId() == R.id.button1){ Toast.makeText(context, "Button 1 Click", Toast.LENGTH_LONG).show(); } } 

Consulte este artículo para obtener más detalles

  • Manejo de diferentes tamaños de pantalla (Android)
  • Android & libgdx - ¿Cómo usar los recursos sólo una vez para los proyectos de escritorio y Android?
  • WebView, agrega el archivo .CSS local a una página HTML?
  • Android Pluralización no funciona, necesita ayuda
  • ¿Es más fácil suministrar un activo PNG de alta resolución y dejar que Android reduzca esto?
  • ¿Cómo debo almacenar cadenas comunes?
  • Cómo extraer el atributo de nombre de matriz de cadena?
  • ¿Por qué setImageResource no muestra nada?
  • ¿Qué significa exactamente usar el contexto de aplicación?
  • ¿Cómo asigno un dibujable a ImageView
  • Dimens.xml en la carpeta de valores de 7 "y 10" tableta, ¿cómo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.