Почему на самом деле работает защищенный метод android: onClick в действии?
Предположим, вы определили android:onClick="doClick"
в своей Activity
как
protected void doClick(View view) { }
В документации указывается, что
Это имя должно соответствовать общедоступному методу, который принимает ровно один параметр типа View.
Это заданное требование базового Class.getMethod()
, который находит только общедоступные методы, поскольку в документации указано, что это
Возвращает объект Method
который отражает указанный метод открытого элемента класса или интерфейса, представленный этим объектом Class
.
Итак, как это возможно, что эта реализация, которая не должна работать вообще, работает на некоторых устройствах и эмуляторах, в то время как она не работает на других, используя те же уровни API?
Ответы
Ответ 1
Я отлаживал конкретные реализации. Соответствующая часть кода находится в библиотеке поддержки, используя Class.getMethod()
.
Как указано в документации, этот метод обнаруживает только общедоступные методы и ведет себя корректно. По какой-то причине все модификаторы объявленных защищенных методов Activity
(это onCreate()
и doClick()
) установлены в 1
, что означает, что они фактически общедоступны.
Я мог наблюдать только это поведение, создавая сборку debug
с помощью Mac. Так почему это происходит, остается открытым вопросом, на который я пытаюсь найти ответ.
Ответ 2
В соответствии с " Учебными пособиями Java ™ ": защищенный модификатор указывает, что к члену можно получить доступ только в своем собственном пакете (как и в пакете private) и, кроме того, подклассом его класса в другом пакете
Ответ 3
Далее происходит под:
View
конструктор "разбирает" его атрибуты и если onClick
значения атрибута != null
он устанавливает анонимный onClickListener
на View
. В рамках реализации слушателя объект отражения Метод создан и один раз клик происходит Method
метод с именем, присвоенным в xml
является вызывается с помощью отражения.
Это причина, по которой protected void doClick(View view)
. Это не было бы, если бы ваш Activity/Fragment
реализовал View.OnClickListener
с protected void onClick(View view)
.
Я не могу сказать, почему он работает с устройства на устройство. Мое лучшее предположение - это разные версии Android
.