setonclicklistener - Android OnClickListener: identifica un botón
programacion android pdf 2018 (11)
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?
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.
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.
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.
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;
}
}
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;
}
}
}
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;
}
}
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.
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;
}
}
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:
<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" />
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();
}
}
Button mybutton = new Button(ViewPagerSample.this);
mybutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});