Android onClick en XML vs. OnClickListener

Me doy cuenta de que una pregunta similar ha sido formulada antes, pero esto es diferente. Soy bastante nuevo en el desarrollo de aplicaciones de Android y tengo tres preguntas con respecto a la diferencia (s) entre el android:onclick="" atributo XML y el método setOnClickListener .

  1. ¿Cuáles son las diferencias entre los dos? ¿La diferencia entre las dos implementaciones se encuentra en tiempo de comstackción o tiempo de ejecución o ambos?

  2. ¿Qué casos de uso son favorables para qué implementación?

  3. ¿Qué diferencia (s) tiene el uso de fragmentos en Android en la elección de implementación?

Diferencia entre OnClickListener vs OnClick:

  • OnClickListener es la interfaz que necesita implementar y se puede establecer en una vista en código Java.
  • OnClickListener es lo que espera a que alguien realmente haga clic, un clic determina lo que sucede cuando alguien hace clic.
  • Últimamente, android agregó un atributo xml a las vistas llamadas android: onclick, que se puede usar para manejar los clics directamente en la actividad de la vista sin necesidad de implementar ninguna interfaz.
  • Podría cambiar fácilmente una implementación de escucha por otra si lo necesita.
  • Un OnClickListener le permite separar la acción / comportamiento del evento click de la Vista que desencadena el evento. Mientras que para casos simples esto no es tan importante, para el manejo complejo de eventos, esto podría significar una mejor legibilidad y mantenimiento del código
  • Como OnClickListener es una interfaz, la clase que lo implementa tiene flexibilidad para determinar las variables de instancia y los métodos que necesita para manejar el evento. De nuevo, esto no es gran cosa en casos simples, pero para casos complejos, no queremos mezclar necesariamente las variables / métodos relacionados con el manejo de eventos con el código de la Vista que desencadena el evento.
  • El onClick con enlace de función en XML Layout es un enlace entre onClick y la función que llamará. La función debe tener un argumento (la Vista) para que onClick funcione.

Ambos funcionan de la misma manera, solo que uno se establece a través del código java y el otro a través del código xml.

Implementación del código setOnClickListener:

 Button btn = (Button) findViewById(R.id.mybutton); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { myFancyMethod(v); } }); // some more code public void myFancyMethod(View v) { // does something very interesting } 

Implementación de XML:

 < ?xml version="1.0" encoding="utf-8"?>    

Actuación:

Ambos son iguales en rendimiento. Xml es pre-analizado en código binario durante la comstackción. por lo tanto, no hay ningún problema en Xml.

Limitación:

android: onClick es para el nivel 4 de la API en adelante, por lo que si tiene como objective <1.6, entonces no puede usarlo.

Simplemente:

Si tienes android:onClick = "someMethod" en xml , busca el public void someMethod en tu clase de Actividad. OnClickListener se llama directamente desde su Actividad y está vinculado a alguna View particular. Por ejemplo, someButton.setOnClickListener y en el código siguiente se dice lo que se debe hacer cuando se presiona someButton .

Espero eso ayude 🙂

Estoy sorprendido de que nadie haya hablado de esto, pero tenga cuidado, aunque android:onClick XML parece ser una forma conveniente de manejar el clic, la implementación setOnClickListener hace algo más que agregar el onClickListener . De hecho, puso la propiedad view clickable en true.

Si bien es posible que no sea un problema en la mayoría de las implementaciones de Android, de acuerdo con el constructor del teléfono, el botón siempre es predeterminado para hacer clic = verdadero, pero otros constructores en algún modelo de teléfono pueden tener un clic = falso predeterminado en vistas de botones.

Entonces, establecer el XML no es suficiente, tienes que pensar todo el tiempo para agregar android:clickable="true" en el botón no, y si tienes un dispositivo donde el valor predeterminado es clickable = true e incluso olvidas poner este XML atributo, no se dará cuenta del problema en tiempo de ejecución, pero recibirá los comentarios en el mercado cuando esté en manos de sus clientes.

Además, nunca podemos estar seguros de cómo Proguard ofuscará y cambiará el nombre de los atributos XML y el método de clase, por lo que no es 100% seguro de que nunca tendrán un error algún día.

Entonces, si nunca quieres tener problemas y nunca lo piensas, es mejor usar setOnClickListener o bibliotecas como ButterKnife con la anotación @OnClick(R.id.button)

Como dije antes: ambos son una forma de agregar lógica en respuesta a un evento, en este caso un evento ‘clic’.

Me gustaría una separación entre lógica y presentación, tal como lo hacemos en el mundo de HTML / JavaScript: deje el XML para la presentación y agregue oyentes de eventos por medio de código.

Si tiene varios botones que usan solo un método, le sugiero que lo haga en Java. Pero si tiene un botón con un método específico, onClick en XML sería mejor.

Es más conveniente usar siempre el atributo android: onClick a menos que tenga una buena razón para no hacerlo, por ejemplo, si crea una instancia del botón en tiempo de ejecución o si necesita declarar el comportamiento del clic en una subclase Fragment.

Creo que la principal diferencia entre ellos es:

OnClick: cuando haces clic en el botón con tu dedo.

OnClickListner: Puede ser una opción más amplia que se implementará en varios códigos.

Por ejemplo, cuando escribe url “ymail.com”, yahoo encuentra su nombre de usuario y contraseña en su navegador y habilita el botón de estado de clic para abrir su correo. Esta acción solo debe implementarse en onClickListener.

Esta es mi idea!