Esta pergunta é feita em muitos lugares e de várias maneiras diferentes. Originalmente, eu respondi aqui, mas acho que é relevante também neste tópico (desde que acabei aqui quando estava procurando por uma resposta).
Não há uma solução de linha para esse problema, mas isso funcionou para o meu caso de uso. O problema é que o construtor 'View (context, attrs, defStyle)' não se refere a um estilo real, ele quer um atributo. Então, vamos:
- Definir um atributo
- Crie um estilo que você deseja usar
- Aplique um estilo para esse atributo em nosso tema
- Crie novas instâncias de nossa visão com esse atributo
Em 'res / values / attrs.xml', defina um novo atributo:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="customTextViewStyle" format="reference"/>
...
</resources>
Em res / values / styles.xml ', vou criar o estilo que quero usar no meu TextView personalizado
<style name="CustomTextView">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:paddingLeft">14dp</item>
</style>
Em 'res / values / themes.xml' ou 'res / values / styles.xml', modifique o tema para seu aplicativo / atividade e adicione o seguinte estilo:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
<item name="@attr/customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
Finalmente, no seu TextView personalizado, agora você pode usar o construtor com o atributo e ele receberá seu estilo
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
Vale a pena notar que eu usei repetidamente customTextView em diferentes variantes e lugares diferentes, mas não é necessário que o nome da exibição corresponda ao estilo, ao atributo ou a qualquer coisa. Além disso, essa técnica deve funcionar com qualquer exibição personalizada, não apenas com TextViews.