web-dev-qa-db-fra.com

Pourquoi ContextThemeWrapper est-il désormais limité au groupe de bibliothèque de support?

J'ai commencé à utiliser un ContextThemeWrapper pour appliquer dynamiquement un style à un ImageButton; basé ne réponse à une autre de mes questions, et des réponses à d'autres similairequestions .

ContextThemeWrapper wrapper = new ContextThemeWrapper(getContext(), mStyleRes);
mImageButton = new AppCompatImageButton(wrapper, null, 0);

Mais récemment, une erreur sur les peluches a commencé à apparaître sur le constructeur ContextThemeWrapper indiquant:

ContextThemeWrapper ne peut être appelé qu'à partir du même groupe de bibliothèques (groupId = com.Android.support)

J'ai remarqué que la classe marquée avec l'annotation @RestrictTo(LIBRARY_GROUP), ce qui provoque l'apparition de l'erreur de peluche. Mais je ne trouve aucune information sur pourquoi il est limité au groupe de bibliothèques com.Android.support.

Pour autant que je sache, c'est la seule façon d'appliquer un style, un thème ou une superposition de thème à un View par programmation; autre que la définition d'un attribut de style par défaut comme troisième argument dans le constructeur. Je me demande donc pourquoi son utilisation serait restreinte du tout; y a-t-il un problème avec l'utilisation de la classe en dehors des bibliothèques de support? Pourrait-il y avoir des effets secondaires dont je ne suis pas au courant?


La seule question similaire que j'ai rencontrée concerne un bug (maintenant corrigé); qui a provoqué l'affichage de cette erreur sur la méthode onCreate d'une sous-classe de AppCompatActivity. Je ne pense pas que cet événement soit un bug, plutôt une restriction délibérée; dont je voudrais connaître le raisonnement.

Je devrais noter; cette restriction (pour l'instant) semble en fait n'avoir aucun effet sur le code utilisant un ContextThemeWrapper. Il compile et fonctionne correctement, et fonctionne comme je m'y attendais.

25
Bryan

Android.view.ContextThemeWrapper ! = Android.support.v7.view.ContextThemeWrapper.

La bibliothèque de support est annotée @RestrictTo(LIBRARY_GROUP), et aussi @hide - ce n'est pas censé être une API publique.

Le premier est public.

57
ephemient