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