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?
- ¿Es posible obtener recursos dentro de un bloque de contexto estático?
- Android - cambia dinámicamente el menú de opciones, pero al inflar desde XML
- Extraer el icono de la aplicación del archivo apk
- R.string; Obtener cadena de nombre de clave dinámica
- Android studio compile error "No se permite el contenido en prolog"
- ¿El android tiene * nativo * imagen de la ayuda SVG como recursos drenables (iconos)?
- Cargar recursos (diseño) desde otro apk dinámicamente
- Cómo realizar 3D Curve Wall con jQuery o js
- Cómo crear un tamaño personalizado de FloatingActionButton
- ¿Hay una herramienta para encontrar recursos no utilizados en un proyecto de Android?
- ADT muestra error en Strings.xml
- Cómo agregar recursos de cadena en Eclipse?
- Android cómo exportar jar con recursos?
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; } }
Switch
– case
es más fácil de mantener que if
– else
, 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
- Android Fatal señal 11 (SIGSEGV) en 0x636f7d89 (código = 1). ¿Cómo se puede localizar?
- El servidor de anuncios no está actualizado