To pytanie jest zadawane w wielu miejscach na wiele różnych sposobów. Początkowo odpowiedziałem na to tutaj, ale czuję, że jest to również istotne w tym wątku (odkąd skończyłem tutaj gdy szukałem odpowiedzi).
Nie ma jednego liniowego rozwiązania tego problemu, ale zadziałało to w moim przypadku użycia. Problem polega na tym, że konstruktor „Widok (kontekst, attrs, defStyle)” nie odnosi się do rzeczywistego stylu, chce atrybutu. Więc będziemy:
- Zdefiniuj atrybut
- Utwórz styl, którego chcesz użyć
- Zastosuj styl dla tego atrybutu w naszym motywie
- Utwórz nowe wystąpienia naszego widoku za pomocą tego atrybutu
W „res / wartości / attrs.xml” zdefiniuj nowy atrybut:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="customTextViewStyle" format="reference"/>
...
</resources>
W res / wartości / styles.xml „Mam zamiar stworzyć styl, którego chcę używać w moim niestandardowym TextView
<style name="CustomTextView">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:paddingLeft">14dp</item>
</style>
W „res / wartości / themes.xml” lub „res / wartości / styles.xml” zmodyfikuj motyw swojej aplikacji / działania i dodaj następujący styl:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
<item name="@attr/customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
Wreszcie, w niestandardowym TextView możesz teraz użyć konstruktora z atrybutem, który otrzyma Twój styl
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
Warto zauważyć, że wielokrotnie używałem customTextView w różnych wariantach i różnych miejscach, ale w żadnym wypadku nie jest wymagane, aby nazwa widoku pasowała do stylu, atrybutu lub czegokolwiek. Ponadto ta technika powinna działać z dowolnym niestandardowym widokiem, a nie tylko z widokami tekstowymi.