¿Cuál es la forma correcta de implementar la interfaz OnClickListener para muchos botones?
10
Mi actividad de Android contiene varios botones que necesitan un OnClickListener. He visto muchas formas diferentes de hacer esto, como ::
Implementando la interfaz en clase de actividad
Crear una clase separada que implemente la interfaz
Definir una clase interna anónima para cada botón.
He visto muchos ejemplos de cada enfoque. Sin embargo, no está claro para mí por qué se utilizaría un enfoque en lugar de otro. ¿Las diferencias entre estos enfoques son estilísticas o existen razones que hacen que un enfoque sea mejor?
Al igual que con muchas cosas, el enfoque correcto depende de lo que está tratando de hacer para el botón específico y qué más está haciendo con la actividad.
La clase de actividad implementa la interfaz :
esta es una buena opción cuando solo tiene un tipo de tarea para ejecutar cuando se llama a este oyente. Un ejemplo de esto sería una forma simple con varios campos y un botón de guardar. Prefiero que mi escucha de eventos no verifique la fuente del evento para decidir qué es lo que realmente hay que hacer. Sé que algunos pueden decir que esto es una cuestión de estilo, pero creo que al no requerir que el oyente haga esta verificación, hace que el código sea más fácil de seguir, ya que sabrá exactamente cómo se llama para cada evento.
Una clase diferente implementa la interfaz :
como dije anteriormente, prefiero esta opción para cuando tengo varios elementos que pueden activar el mismo evento. Extendiendo el ejemplo anterior, agreguemos un botón claro que también requiere un escucha de clics. Cree un oyente que preforma las acciones de guardar y uno que preforma las acciones claras. Cada escucha solo se agrega a los componentes que producirán esa acción.
Esta implementación tiene un beneficio adicional que puede utilizar si le importa. El beneficio es que evita que otras clases activen el evento dentro de su clase de actividad. Dado que el método de la interfaz debe ser público, cualquier persona con una referencia a la clase puede activar el evento. Si desea un control detallado sobre quién puede hacer qué en la aplicación, una clase separada evita que cualquier persona con una referencia a la actividad active o borre su formulario (o posiblemente rompa el código si el oyente utiliza la fuente, pero lo hace) no manejar mal entrada).
Una clase interna anónima implementa la interfaz :
Esta es realmente una forma específica de construir la segunda opción de usar una clase diferente como implementación. Esta opción puede restringir aún más quién tiene acceso para desencadenar el evento ya que nadie más puede crear una instancia de la clase. Sin embargo, creo que el factor más importante entre las dos opciones es cuánto trabajo se está haciendo. Borrar algunos campos de texto es una operación simple y directa. Sin embargo, el proceso de guardar el for puede implicar una serie de tareas si está validando la entrada (que debería estar haciendo), escribiendo en una base de datos para almacenar los valores y desencadenando alguna acción de guardado posterior. En este caso, crear una clase separada con su propio archivo proporcionará una división más clara entre el formulario de entrada y el procesamiento de datos. Esto a su vez mantiene el código del formulario en lugar de un archivo más grande con múltiples clases internas anidadas dentro.
Wow, gracias por tu respuesta. En términos de gastos generales, ¿es más costoso crear múltiples clases de oyentes?
slayton
@Slayton: Siempre habrá costos sin importar lo que hagas. La pregunta debería ser "¿Te importa la diferencia?" Hacer más objetos tiene un peso, pero el tiempo de ejecución será más largo si su oyente tiene que revisar una lista de fuentes para decidir qué hacer realmente. Si el uso y el rendimiento de la memoria son importantes para usted, debe perfilar el código y decidir qué es lo mejor según sus requisitos. Sin embargo, dudaría que este sería el cuello de botella de su código. Hasta que se muestre lo contrario, tome sus decisiones para que el código sea más claro y esté mejor organizado.
unholysampler
3
Una cuarta forma es establecer el atributo onClick en el diseño:
interesante, no sabía que pudieras hacer eso. Aunque esto parece ser un mecanismo específico de Android para lidiar con los clics en los botones.
slayton
Sin embargo, generalmente utilizo la "Interfaz de implementos de la clase de actividad", de esa manera, tiene todas las cosas relacionadas con los clics en el mismo lugar.
orjan
Este método en particular no funciona con fragmentos.
Una cuarta forma es establecer el atributo onClick en el diseño:
que tiene este método correspondiente en la Actividad:
fuente