我有两种风格分别叫做红色和绿色,并且我有一个if语句来确定应该应用哪一个,但是我不知道如何从Java中实际应用样式。
我有两种风格分别叫做红色和绿色,并且我有一个if语句来确定应该应用哪一个,但是我不知道如何从Java中实际应用样式。
对于这个问题,没有单一的解决方案,但对我的使用情况有效。问题在于 '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="customTextViewStyle">@style/CustomTextView</item>
</style>
...
</resources>
最后,在您的自定义 TextView 中,现在可以使用带有属性的构造函数,并且它将接收您的样式。在这里,不再是始终
public class CustomTextView extends TextView {
public CustomTextView(Context context, int styleAttribute) {
super(context, null, styleAttribute);
}
// You could also just apply your default style if none is given
public CustomTextView(Context context) {
super(context, null, R.attr.customTextViewStyle);
}
}
有了这些组件,现在您可以使用 if/else 语句在运行时生成新视图,并选择您喜欢的样式。
CustomTextView ctv;
if(useCustomStyles == true){
ctv = new CustomTextView(context, R.attr.customTextViewStyle);
}else{
ctv = new CustomTextView(context, R.attr.someOtherStyle);
}
值得注意的是,我在不同的变量和不同的地方反复使用了customTextView,但是视图的名称与样式、属性或任何其他内容是否匹配并不是必需的。此外,这种技术应该适用于任何自定义视图,而不仅仅是TextView。
<item name="@attr/customTextViewStyle">
没有起作用,我不得不删除@attr
才能使其正常工作,所以只需使用<item name="customTextViewStyle">
。 - petroni可以使用 setTextAppearance(context, resid) 方法对TextView进行编程式样式应用。(样式的resId可以在R.style.YourStyleName中找到)