web-dev-qa-db-fra.com

Pourquoi une méthode Android: onClick protégée dans Activity fonctionne-t-elle réellement?

Supposons que vous définissiez Android:onClick="doClick" dans votre Activity comme

protected void doClick(View view) { }

La documentation indique que

Ce nom doit correspondre à une méthode publique prenant exactement un paramètre de type View.

Ceci est une exigence de la méthode Class.getMethod() sous-jacente, qui ne trouve que les méthodes publiques sous la forme documentation indique qu'elle

Retourne un objet Method qui reflète la méthode de membre public spécifiée de la classe ou de l'interface représentée par cet objet Class.

Alors, comment est-il possible que cette implémentation, qui ne devrait absolument pas fonctionner, fonctionne sur certains périphériques et émulateurs, alors qu'elle ne fonctionne pas sur d'autres utilisant les mêmes niveaux d'API?

30
tynn

J'ai débogué les implémentations particulières. La partie pertinente du code se trouve dans Bibliothèque de support using Class.getMethod().

Comme indiqué dans la documentation, cette méthode ne trouve que les méthodes membres publiques et se comporte correctement. Pour une raison quelconque, tous les modificateurs des méthodes protégées déclarées de Activity (ce sont onCreate() et doClick()) sont définis sur 1, ce qui signifie qu'ils sont en fait publics.

Je ne pouvais qu'observer ce comportement en créant la version debug avec un Mac. La raison pour laquelle cela se produit reste donc une question ouverte, à laquelle j'essaie de trouver une réponse.

0
tynn

Comme indiqué dans " Les didacticiels Java ™ ": Le modificateur protected indique que le membre n'est accessible que par son propre package (comme avec package-private) et, en outre, par une sous-classe de sa classe un autre paquet

0
Regis