Cette question est posée dans beaucoup d'endroits dans beaucoup de différentes manières. J'ai d'abord répondu ici, mais je pense que c'est pertinent dans ce fil (depuis que j'ai fini ici, quand j'étais à la recherche d'une réponse).
Il n'existe pas de ligne de solution à ce problème, mais cela a fonctionné pour mon cas d'utilisation. Le problème est, 'View(context, attrs, defStyle) constructeur ne fait pas référence à un style réel, il veut un attribut. Donc, nous allons:
- Définir un attribut
- Créer un style que vous souhaitez utiliser
- Appliquer un style de cet attribut sur notre thème
- Créer de nouvelles instances de notre point de vue avec cet attribut
Dans 'res/values/attrs.xml', de définir un nouvel attribut:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="customTextViewStyle" format="reference"/>
...
</resources>
Dans res/values/styles.xml " je vais créer le style que je veux utiliser sur mon custom TextView
<style name="CustomTextView">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:paddingLeft">14dp</item>
</style>
Dans 'res/values/themes.xml" ou "res/values/styles.xml', de modifier le thème de votre application / activité et ajouter du style suivant:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
<item name="@attr/customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
Enfin, dans votre personnalisé TextView, vous pouvez maintenant utiliser le constructeur avec l'attribut et vous recevrez votre style
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
Il est intéressant de noter que j'ai utilisé à plusieurs reprises customTextView en différentes variantes et différents endroits, mais il n'est pas nécessaire que le nom de la vue correspondre au style ou à l'attribut ou quoi que ce soit. Aussi, cette technique fonctionne avec n'importe quel affichage personnalisé, et pas seulement TextViews.