Con una sólida experiencia en el área que no es de Java ni de Android, estoy aprendiendo Android.
Tengo mucha confusión con diferentes áreas, una de ellas es cómo manejar los clics en los botones. Hay al menos 4 formas de hacerlo (!!!), se enumeran brevemente aquí
por motivos de coherencia, los enumeraré:
Tenga un miembro de la
View.OnClickListener
clase en la actividad y asígnelo a una instancia que manejará laonClick
lógica en elonCreate
método de la actividad.Cree 'onClickListener' en el método de actividad 'onCreate' y asígnelo al botón usando setOnClickListener
Implemente 'onClickListener' en la actividad misma y asigne 'this' como oyente para el botón. En el caso de que la actividad tenga pocos botones, se debe analizar la identificación del botón para ejecutar el controlador 'onClick' para el botón adecuado
Tenga un método público en la actividad que implemente la lógica 'onClick' y asígnelo al botón en la declaración xml de la actividad
Pregunta 1:
¿Son todos esos métodos, hay alguna otra opción? (No necesito otro, solo curiosidad)
Para mí, la forma más intuitiva sería la última: requiere que se escriba la menor cantidad de código y es la más legible (al menos para mí).
Sin embargo, no veo que este enfoque se use ampliamente. ¿Cuáles son las desventajas de usarlo?
Pregunta 2:
¿Cuáles son las ventajas y desventajas de cada uno de estos métodos? Comparta su experiencia o un buen enlace.
¡Cualquier comentario es bienvenido!
PD: He intentado buscar en Google y encontrar algo para este tema, pero las únicas cosas que he encontrado son la descripción "cómo" hacerlo, no por qué es bueno o malo.
onCreate()
que no sea demasiado larga. Las asignaciones de escucha de clics y las clases anónimas se pueden factorizar en un método auxiliar separado desde el que se llamaonCreate()
.# 1 Utilizo el último con frecuencia cuando tengo botones en el diseño que no se generan (pero obviamente estáticos).
Si lo usa en la práctica y en una aplicación comercial, preste especial atención aquí, porque cuando usa source ofuscater como ProGuard, deberá marcar estos métodos en su actividad para que no se ofusquen.
Para archivar algún tipo de seguridad en tiempo de compilación con este enfoque, eche un vistazo a Android Lint ( ejemplo ).
# 2 Los pros y los contras de todos los métodos son casi los mismos y la lección debería ser:
Si tiene que asignar lo mismo
OnClickListener
a varias instancias de botón, guárdelo en el ámbito de clase (# 1). Si necesita un oyente simple para un botón, realice una implementación anónima:Tiendo a no implementar el
OnClickListener
en la actividad, esto se vuelve un poco confuso de vez en cuando (especialmente cuando implementa varios otros controladores de eventos y nadie sabe lo quethis
está haciendo).fuente
Prefiero la opción 4, pero tiene sentido intuitivo para mí porque trabajo demasiado en Grails, Groovy y JavaFX. Las conexiones "mágicas" entre la vista y el controlador son comunes en todos. Es importante nombrar bien el método:
En la vista, agregue el método onClick al botón u otro widget:
Luego, en la clase, maneje el método:
Nuevamente, nombre el método claramente, algo que debe hacer de todos modos, y el mantenimiento se convierte en algo natural.
Una gran ventaja es que ahora puede escribir pruebas unitarias para el método. La opción 1 puede hacer esto, pero la 2 y la 3 son más difíciles.
fuente
La forma más utilizada es la declaración anónima.
También puede crear el objeto View.OnClickListener y configurarlo como botón más tarde, pero aún necesita anular el método onClick, por ejemplo
Cuando su actividad implementa la interfaz OnClickListener, debe anular el método onClick (Ver v) en el nivel de actividad. Luego puede asignar esta actividad como botón de escucha, porque ya implementa la interfaz y anula el método onClick ()
(En mi humilde opinión) 4-th enfoque utilizado cuando varios botones tienen el mismo controlador, y puede declarar un método en la clase de actividad y asignar este método a varios botones en el diseño xml, también puede crear un método para un botón, pero en este caso yo prefiero declarar controladores dentro de la clase de actividad.
fuente
Las opciones 1 y 2 implican el uso de una clase interna que hará que el código sea un poco desordenado. La opción 2 es un poco complicada porque habrá un oyente para cada botón. Si tiene una pequeña cantidad de botones, está bien. Para la opción 4, creo que será más difícil de depurar, ya que tendrá que retroceder y cuarto el código xml y java. Yo personalmente uso la opción 3 cuando tengo que manejar varios clics de botones.
fuente
Mi muestra, probada en Android Studio 2.1
Definir botón en diseño xml
Detección de pulsaciones de Java
fuente
Para facilitar las cosas como se indica en la Pregunta 2, puede utilizar el método lambda como este para ahorrar memoria variable y evitar navegar hacia arriba y hacia abajo en su clase de vista
pero si desea aplicar un evento de clic a su botón de una vez en un método.
puede hacer uso de la Pregunta 3 de @D. Tran responde. Pero no olvide implementar su clase de vista con
View.OnClickListener
.En otro para usar la Pregunta # 3 correctamente
fuente
Pregunta n. ° 1: esta es la única forma de manejar los clics de vista.
Pregunta 2 -
Opción # 1 / Opción # 4 - No hay mucha diferencia entre la opción # 1 y la opción # 4. La única diferencia que veo es que en un caso, la actividad es implementar OnClickListener, mientras que, en el otro caso, habría una implementación anónima.
Opción # 2 - En este método se generará una clase anónima. Este método es un poco engorroso, ya que tendría que hacerlo varias veces, si tiene varios botones. Para las clases anónimas, debe tener cuidado al manejar las pérdidas de memoria.
Opción # 3 - Sin embargo, esta es una manera fácil. Por lo general, los programadores intentan no utilizar ningún método hasta que lo escriben y, por tanto, este método no se utiliza mucho. Vería que la mayoría de la gente usa la Opción # 4. Porque es más limpio en términos de código.
fuente
También hay opciones disponibles en forma de varias bibliotecas que pueden hacer que este proceso sea muy familiar para las personas que han utilizado otros marcos MVVM.
https://developer.android.com/topic/libraries/data-binding/
Muestra un ejemplo de una biblioteca oficial, que le permite vincular botones como este:
fuente
Paso 1: cree un archivo XML:
Paso 2: crear MainActivity:
HappyCoding!
fuente