Questa domanda viene posta in molti punti in molti modi diversi. Inizialmente ho risposto qui, ma ritengo sia rilevante anche in questo thread (da quando sono finito qui quando sono mentre cercavo una risposta).
Non esiste una soluzione a una linea per questo problema, ma ha funzionato per il mio caso d'uso. Il problema è che il costruttore 'View (context, attrs, defStyle)' non fa riferimento a uno stile reale, vuole un attributo. Quindi:
- Definire un attributo
- Crea uno stile che desideri utilizzare
- Applica uno stile per quell'attributo sul nostro tema
- Crea nuove istanze della nostra vista con quell'attributo
In "res / valori / attrs.xml", definisci un nuovo attributo:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="customTextViewStyle" format="reference"/>
...
</resources>
In res / valori / styles.xml 'ho intenzione di creare lo stile che voglio usare sul mio TextView personalizzato
<style name="CustomTextView">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:paddingLeft">14dp</item>
</style>
In "res / valori / temi.xml" o "res / valori / stili.xml", modifica il tema per la tua applicazione / attività e aggiungi il seguente stile:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
<item name="@attr/customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
Infine, nel tuo TextView personalizzato, ora puoi usare il costruttore con l'attributo e riceverà il tuo stile
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
Vale la pena notare che ho usato ripetutamente customTextView in diverse varianti e luoghi diversi, ma non è in alcun modo necessario che il nome della vista corrisponda allo stile o all'attributo o altro. Inoltre, questa tecnica dovrebbe funzionare con qualsiasi vista personalizzata, non solo con TextViews.