Pertanyaan ini ditanyakan di banyak tempat dengan banyak cara berbeda. Saya awalnya menjawabnya di sini tetapi saya merasa itu relevan di utas ini juga (karena saya berakhir di sini ketika saya sedang mencari jawaban).
Tidak ada solusi satu baris untuk masalah ini, tetapi ini berfungsi untuk kasus penggunaan saya. Masalahnya adalah, konstruktor 'Tampilan (konteks, attrs, defStyle)' tidak merujuk ke gaya aktual, ia menginginkan atribut. Jadi, kami akan:
- Tentukan atribut
- Buat gaya yang ingin Anda gunakan
- Terapkan gaya untuk atribut itu pada tema kami
- Buat contoh baru dari tampilan kami dengan atribut itu
Di 'res / values / attrs.xml', tentukan atribut baru:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="customTextViewStyle" format="reference"/>
...
</resources>
Dalam res / values / styles.xml 'Saya akan membuat style yang ingin saya gunakan pada TextView kustom saya
<style name="CustomTextView">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:paddingLeft">14dp</item>
</style>
Dalam 'res / values / themes.xml' atau 'res / values / styles.xml', modifikasi tema untuk aplikasi / aktivitas Anda dan tambahkan gaya berikut:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
<item name="@attr/customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
Terakhir, di TextView kustom Anda, sekarang Anda dapat menggunakan konstruktor dengan atribut dan itu akan menerima gaya Anda
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
Perlu dicatat bahwa saya berulang kali menggunakan customTextView di berbagai varian dan tempat yang berbeda, tetapi sama sekali tidak diperlukan bahwa nama tampilan cocok dengan gaya atau atribut atau apa pun. Selain itu, teknik ini harus bekerja dengan tampilan kustom apa pun, bukan hanya TextViews.