usar studio programacion móviles metodo fragments desarrollo curso como aplicaciones java android reflection android-source

java - studio - metodo onclick android



¿Por qué funciona realmente un método protegido android: onClick en Activity? (3)

Supongamos que defines android:onClick="doClick" en tu Activity como

protected void doClick(View view) { }

La documentation establece que

Este nombre debe corresponder a un método público que toma exactamente un parámetro de tipo Ver.

Este es un requisito dado del método subyacente Class.getMethod() , que solo encuentra métodos públicos ya que la documentation establece que

Devuelve un objeto Method que refleja el método miembro público especificado de la clase o interfaz representada por este objeto Class .

Entonces, ¿cómo es posible que esta implementación, que no debería funcionar en absoluto, funcione en algunos dispositivos y emuladores, mientras que no funcione en otros que usan los mismos niveles de API también?


Depuré las implementaciones particulares. La parte relevante del código se encuentra dentro de la Biblioteca de soporte utilizando Class.getMethod() .

Como se indica en la documentación, este método solo encuentra métodos miembros públicos y se comporta correctamente. Por alguna razón, todos los modificadores de los métodos protegidos declarados de la Activity (estos son onCreate() y doClick() ) se establecen en 1 , lo que significa que estos son realmente públicos.

Solo pude observar este comportamiento al crear la compilación de debug con una Mac. Entonces, ¿por qué sucede esto? Sigue siendo una pregunta abierta, que estoy tratando de encontrar una respuesta.


Lo siguiente está pasando underneath :

El constructor de View "analiza" sus atributos y, si el valor de atributo de onClick != null onClickListener establece un onClickListener anónimo en la View . Dentro de la implementación del oyente se crea un Method reflexión Method y, una vez que se hace clic, se invoked método del método con el nombre asignado en xml través de la reflexión.

Esa es la razón por la cual el protected void doClick(View view) funciona. No sería si su Activity/Fragment implementara View.OnClickListener con el protected void onClick(View view) .

No puedo decir por qué funciona de un dispositivo a otro. Mi mejor suposición es una versión de Android diferente.


Según " The Java ™ Tutorials ": el modificador protected especifica que solo se puede acceder al miembro dentro de su propio paquete (como con package-private) y, además, por una subclase de su clase en otro paquete