这个问题在很多地方以许多不同的方式提出。我最初在这里回答了这个问题,但我觉得它在该主题中也很重要(因为我在这里寻找答案时就在这里结束了)。
对于这一问题,没有一线解决方案,但这在我的用例中有效。问题是,“ 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。