PDA

Ver la Versión Completa : [ SOLUCIONADO ] Declarando función de botón


KrLx_roller
24/12/11, 19:44:54
Hay diferentes métodos de declarar la función de un botón, y yo ahora mismo estoy entre dos, ya que no estoy seguro de la diferencia que hay entre estas dos.

Primer método:
boton1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Uno.this, Dos.class);
startActivity(intent);
}
});

Segundo método:
boton1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.boton1:
Intent intent = new Intent(Uno.this, Dos.class);
startActivity(intent);
finish();
break;
}
}
});

Os agradecería mucho si me explicarais que diferencia hay entre estos dos métodos. Muchas gracias!

kriogeN
24/12/11, 20:07:29
A ver, con el código que has puesto sería más correcto el primer método, aunque ambos métodos son correctos.

Y ahora te explico la diferencia, en el segundo método tienes una condición de que solo se ejecute el código si el botón que has pulsado es boton1 (eso es lo que hace el switch), pero el código lo estás asociando directamente a boton1, con lo cual es redundante y sobra.

Y ahora, ¿para que sirve entonces ese switch?

El método setOnClickListener recibe como parametro un objeto de tipo OnClickListener, el cual puede estar ya definido a priori, y así usar el mismo código para varios botones, lo que ocurre es que la mayoría de la gente (y yo me incluyo) lo asociamos directamente al botón poniendo el new OnClickListener() en el método setOnClickListener.

Así que ese switch solo tiene sentido en un caso como el siguiente:


OnClickListener click = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.boton1:
Intent intent = new Intent(Uno.this, Dos.class);
startActivity(intent);
finish();
break;
case R.id.boton2:
Intent intent = new Intent(Uno.this, Tres.class);
startActivity(intent);
finish();
break;
}
}
};
boton1.setOnClickListener(click);
boton2.setOnClickListener(click);
Este código usa el mismo OnClickListener, pero según el botón que haya ejecutado el código se ejecutará un código u otro.

Espero haberte aclarado la duda.

KrLx_roller
24/12/11, 20:36:39
La has aclarado y ademas muy bien explicado. Pero ahora me salta otra duda: entonces qué es mejor? Declarar un solo ClickListener con un switch y añadir todos los botones en ese mismo, o declarar tantos Listener como botones haya?
Me refiero a cuál tendrá menos carga sobre la CPU, ya que en algunos Views tengo más de 10 buttons.

Gracias!

kriogeN
24/12/11, 20:52:20
Da igual, aunque yo veo mejor declarar un ClickListener para cada botón, tal y como estabas haciendo hasta ahora, así es más fácil hacer el mantenimiento del código.

KrLx_roller
24/12/11, 20:53:12
Muchas gracias KriogeN!