Me doy cuenta de que antes se ha hecho una pregunta con una redacción similar, pero esta es diferente. Soy bastante nuevo en el desarrollo de aplicaciones de Android y tengo tres preguntas sobre las diferencias entre el android:onclick=""
atributo XML y el setOnClickListener
método.
¿Cuáles son las diferencias entre los dos? ¿Se encuentra la diferencia entre las dos implementaciones en tiempo de compilación, en tiempo de ejecución o en ambos?
¿Qué casos de uso son favorables a qué implementación?
¿Qué diferencia (s) hace el uso de fragmentos en Android en la elección de implementación?
android
xml
performance
android-fragments
KG6ZVP
fuente
fuente
onclick
ya que debe asegurarse de que todas las clases implementen ese método. Esto es asumiendo que está utilizando el diseño más de una vez. Sin embargo, si tuviera una interfaz java para asegurarse de que el método estuviera en todas las clases que lo implementaron, no tendría que preocuparse.android:onclick
cuando es conveniente, pero sé que a veces ha causado problemas, y tampoco puedo recordarlos :)Respuestas:
Diferencia entre OnClickListener vs OnClick:
Ambos funcionan de la misma manera, solo que uno se configura 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 XML:
<?xml version="1.0" encoding="utf-8"?> <!-- layout elements --> <Button android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click me!" android:onClick="myFancyMethod" /> <!-- even more layout elements -->
Actuación:
Ambos son iguales en rendimiento. Xml se analiza previamente en código binario durante la compilación. por lo que no hay gastos generales en Xml.
Limitación:
android: onClick es para el nivel de API 4 en adelante, por lo que si su objetivo es <1.6, no puede usarlo.
fuente
Me sorprende que nadie haya hablado de esto, pero tenga cuidado, aunque
android:onClick
XML parece ser una forma conveniente de manejar el clic, lasetOnClickListener
implementación hace algo más que agregar elonClickListener
. De hecho, puso la propiedad viewclickable
en true.Si bien puede que no sea un problema en la mayoría de las implementaciones de Android, según el constructor del teléfono, el botón siempre es predeterminado para hacer clic = verdadero, pero otros constructores en algunos modelos de teléfono pueden tener un clic predeterminado = falso en vistas que no son de botón.
Entonces, configurar el XML no es suficiente, debe pensar todo el tiempo para agregar
android:clickable="true"
un botón no, y si tiene un dispositivo donde el valor predeterminado es hacer clic = verdadero y olvida incluso una vez poner este atributo XML, no lo notará el problema en tiempo de ejecución, pero obtendrá la retroalimentación 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 que nunca tendrán un error algún día.
Entonces, si nunca quiere tener problemas y nunca pensar en ello, es mejor usar
setOnClickListener
bibliotecas como ButterKnife con anotación@OnClick(R.id.button)
fuente
android:onClick
?Simplemente:
Si lo tiene
android:onClick = "someMethod"
en xml , busca elpublic void someMethod
en su clase Activity.OnClickListener
se llama directamente desde su Actividad y está vinculado a algún archivoView
. Por ejemplosomeButton.setOnClickListener
y en el código siguiente se dice lo que hay que hacer cuandosomeButton
se presiona.Espero eso ayude :)
fuente
Como se dijo antes: ambos son una forma de agregar lógica en respuesta a un evento, en este caso un evento de 'clic'.
Yo optaría por una separación entre la lógica y la presentación, como hacemos en el mundo HTML / JavaScript: dejar el XML para la presentación y agregar oyentes de eventos mediante código.
fuente
Si tiene varios botones con un solo 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.
fuente
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 de Fragmento.
fuente
Hay un par de razones por las que es posible que desee establecer mediante programación un
OnClickListener
. La primera es si alguna vez desea cambiar el comportamiento de su botón mientras se ejecuta su aplicación. Puede apuntar su botón a otro método por completo, o simplemente deshabilitar el botón configurando unOnClickListener
que no hace nada.Cuando define un oyente utilizando el
onClick
atributo, la vista busca un método con ese nombre solo en su actividad de host. La configuración programática de un leOnClickListener
permite controlar el comportamiento de un botón desde otro lugar que no sea su actividad de host. Esto será muy relevante cuando usemosFragments
, que son básicamente mini actividades, lo que le permite crear colecciones reutilizables de vistas con su propio ciclo de vida, que luego se pueden ensamblar en actividades. Los fragmentos siempre deben usarseOnClickListeners
para controlar sus botones, ya que no son actividades y no se buscarán los oyentes definidos en onClick.fuente
Creo que la principal diferencia entre ellos es:
OnClick: cuando hace clic en el botón con el dedo.
OnClickListner: Puede ser una opción más amplia que se implemente en varios códigos.
Por ejemplo, cuando escribe url "ymail.com", Yahoo busca 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 debe implementarse solo en onClickListener.
¡Esta es mi idea!
fuente