Android OnClickListener: identifica 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 reviso qué botón se ha hecho clic?

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 bien, si está trabajando con solo un cliqueador de clics, puede hacer:

 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; } } } 

Sin embargo, no recomiendo hacerlo de esa manera ya que tendrá que agregar un if para cada botón que use. Eso es difícil de mantener.

O puede intentar lo mismo pero sin oyentes. En su definición de botón XML:

 android:onClick="ButtonOnClick" 

Y en tu código define 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.

Cinco maneras de telegrafiar un evento El oyente es un excelente artículo que muestra las diversas formas de configurar un solo oyente de eventos. Permítanme ampliar eso aquí para múltiples oyentes.

1. Clase de 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 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 vista 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:

   

Si no quiere guardar instancias del botón 2 en el código de clase, siga esta MEJOR manera (¡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; } } 

Otra forma de hacerlo es un solo oyente de la actividad, como este:

 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 IF único en lugar de cambiar-else, pero si lo prefiere, 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 forma es switch entre v.getId (). Tener OnClickListener anónimo por separado para cada botón consume más memoria. Casting View to Button es innecesario. Usar if-else cuando el cambio es posible es más lento y más difícil de leer. En la fuente de Android, a menudo puede notar la comparación de las referencias por if-else:

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

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

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 crea un controlador para ambos botones, puede comparar directamente v con b1 y b2, o si desea comparar por ID, no es necesario lanzar el botón v to (también tiene el método View the getId ()), y de esa manera no hay que preocuparse por la excepción de conversión.

 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(); } } 

Mira este artículo para más detalles