Этот вопрос задают во многих местах множеством разных способов.Первоначально я ответил на это здесь, но я чувствую, что это актуально и в этой теме (так как я закончил здесь , когда я искал ответ).
Нет единственного решения этой проблемыпроблема, но это сработало для моего варианта использования.Проблема в том, что конструктор View (context, attrs, defStyle) не ссылается на фактический стиль, ему нужен атрибут.Итак, мы будем:
- Определить атрибут
- Создать стиль, который вы хотите использовать
- Применить стиль для этого атрибута в нашей теме
- Создайте новые экземпляры нашего представления с этим атрибутом
В 'res / values / attrs.xml' определите новый атрибут:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="customTextViewStyle" format="reference"/>
...
</resources>
В res / values /styles.xml 'Я собираюсь создать стиль, который хочу использовать в моем настраиваемом TextView
<style name="CustomTextView">
<item name="android:textSize">18sp</item>
<item name="android:textColor">@color/white</item>
<item name="android:paddingLeft">14dp</item>
</style>
В' res / values / themes.xml 'или' res / values / styles.xml ',измените тему для вашего приложения / действия и добавьте следующий стиль:
<resources>
<style name="AppBaseTheme" parent="android:Theme.Light">
<item name="@attr/customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
Наконец, в вашем пользовательском TextView теперь вы можете использовать конструктор с атрибутом, и он получит ваш стиль
public class CustomTextView extends TextView {
public CustomTextView(Context context) {
super(context, null, R.attr.customTextView);
}
}
Стоит отметить, что я неоднократно использовал customTextView в разных вариантах и в разных местах, но никоим образом не требуется, чтобы имя представления совпадало со стилем, атрибутом или чем-либо еще.Кроме того, этот метод должен работать с любым пользовательским представлением, а не только с TextViews.