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 objetoClass
.
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