Cette question est posée dans de nombreux endroits de différentes manières. J'ai d'abord répondu ici, mais je pense que c'est également pertinent dans ce sujet (puisque je me suis retrouvé ici lorsque je cherchais une réponse).
Il n'y a pas de solution unique à ce problème, mais cela a fonctionné pour mon cas d'utilisation. Le problème est que le constructeur 'View (context, attrs, defStyle)' ne fait pas référence à un style réel, il veut un attribut. Nous allons donc:
- Définissez un attribut
- Créez un style que vous souhaitez utiliser
- Appliquer un style pour cet attribut sur notre thème
- Créez de nouvelles instances de notre vue avec cet attribut
Dans 'res / values / attrs.xml', définissez 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 TextView personnalisé
<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', modifiez le thème de votre application / activité et ajoutez le style suivant:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
<item name="@attr/customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
Enfin, dans votre TextView personnalisé, vous pouvez maintenant utiliser le constructeur avec l'attribut et il recevra votre style
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
Il convient de noter que j'ai utilisé à plusieurs reprises customTextView dans différentes variantes et à différents endroits, mais il n'est en aucun cas requis que le nom de la vue corresponde au style ou à l'attribut ou quoi que ce soit. En outre, cette technique devrait fonctionner avec n'importe quelle vue personnalisée, pas seulement avec TextViews.