Prácticas recomendadas para la implementación de Android onClickListener

Existen cuatro maneras de agregar un onClickListener a una Vista que se puede hacer clic (botón, por ejemplo):

  1. Establezca el atributo onClick en el archivo de diseño que señala un método en la actividad,
  2. Crear una clase interna anónima,
  3. Asigne el onClickListener a una variable de miembro privado.
  4. Haga que el contexto Activity implemente la interfaz onClickListener.

Así que mi pregunta es, ¿cómo elegir una de estas técnicas de implementación sobre otra? ¿Existen mejores prácticas de acuerdo con ciertas condiciones, o es sólo una cuestión de preferencia del programador?

Aquí usamos el patrón de llamada llamada.

public class Button { private Callback callback; public Button(Callback callback) { this.callback = callback; } public void update() { // Check if clicked.. callback.onClick(this); } public interface Callback { public void onClick(Button Button); } } Button b = new Button(new Callback() { @Override public void onClick(Button b) { System.out.println("Clicked"); } }); 

En nuestro caso onClick handler implementa la interfaz View.OnClickListener.

Puntos clave:

  • Consistencia con actividad / fragmento;
  • Acceso a los miembros de la actividad / fragmento;
  • legibilidad;
  • @ Michael Krause mostró un punto más bueno acerca de fugas de memoria ;

1) Atributo en el archivo XML se puede utilizar sólo para la actividad, como @ Karakuri mencionó que utiliza la reflexión que es lento.

2) La clase interna anónima tiene reglas especiales para el acceso a los miembros de la clase inclusiva (ver [1] , [2] ). Hay algunas situaciones en las que pueden ocurrir fugas de memoria (por ejemplo, enhebrado con AsyncTask, Handlers).

3) Aquí usted tiene un acceso completo a los miembros de la clase de inclusión.

4) Es una variación de 3d.

La legibilidad depende del tamaño de su controlador, la lógica pequeña puede estar bien en línea, pero para bloques más grandes de código, considere 3d y 4th.

Nunca utilizo el atributo onClick ya que vincula el diseño a una actividad específica (debe encontrar el método a través de la reflexión). No funciona en Fragmentos.

Las opciones 2 y 3 son virtualmente idénticas. Opción 3 podría ser más ventajoso si desea utilizar el miembro privado como OnClickListener de varias vistas.

La opción 4 está cerca de la opción 3. Una diferencia clave es que cambia la declaración de clase, así que si es importante que mantenga la declaración de clase libre de implementaciones de interfaz (o tal vez necesite mantener algún tipo de compatibilidad binaria), puede No quiero usar esta opción.

Mi consejo es evitar la opción 1 y elegir lo que mejor se adapte a su estilo de código. Tampoco está obligado a utilizar el mismo enfoque en cada lugar del código.

  • El evento LongClick ocurre demasiado rápido. ¿Cómo puedo aumentar el tiempo de clic requerido para activarlo?
  • Android: Añade escuchas de eventos a cada elemento de un ListView
  • Cómo mantener DropDownList de AutoCompleteTextView abierto después de presionar la tecla Atrás?
  • Detectar evento de desplazamiento en el navegador de Android
  • Cómo detectar un evento TOUCH con otro dedo mientras un ACTION_MOVE está en proceso
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.