Этот вопрос задается во многих местах по-разному. Первоначально я ответил на это здесь, но я чувствую, что это актуально и в этой теме (так как я оказался здесь когда искал ответ).
Нет единого решения этой проблемы, но это сработало для моего варианта использования. Проблема в том, что конструктор 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.