这个问题在很多地方以不同的方式被问到。我最初在这里回答了这个问题,但我觉得它在这个帖子中也是相关的(因为当我在寻找答案时,我在这里结束了)。
这个问题没有单一的解决方案,但这对我的用例是有效的。问题是,'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,但它并不要求视图的名称与样式或属性或任何东西匹配。此外,这种技术应该适用于任何自定义视图,而不仅仅是textview。