如何以编程方式应用样式?

Som*_*omk 20 android

我有一个名为Red和Green的样式,我有一个if语句来找出要应用的内容,但我不知道实际应用java中的样式的代码.

Kev*_*ant 33

这个问题没有一线解决方案,但这适用于我的用例.问题是,'View(context,attrs,defStyle)'构造函数不引用实际样式,它需要一个属性.所以,我们将:

  1. 定义属性
  2. 创建要使用的样式
  3. 在我们的主题上为该属性应用样式
  4. 使用该属性创建视图的新实例

在'res/values/attrs.xml'中,定义一个新属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

在'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>
Run Code Online (Sandbox Code Playgroud)

最后,在自定义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);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用所有这些组件,您现在可以使用您喜欢的样式执行if/else语句以在运行时生成新视图

CustomTextView ctv;
if(useCustomStyles == true){
    ctv = new CustomTextView(context, R.attr.customTextViewStyle);
}else{
    ctv = new CustomTextView(context, R.attr.someOtherStyle);
}
Run Code Online (Sandbox Code Playgroud)

值得注意的是,我在不同的变体和不同的地方重复使用customTextView,但是视图的名称与样式或属性或任何东西都不匹配.此外,此技术应该适用于任何自定义视图,而不仅仅是TextViews.


小智 12

可以使用setTextAppearance(context,resid)方法以编程方式将样式应用于TextView .(样式的resId可以在R.style.YourStyleName中找到)


Som*_*omk 6

我发现这只能在从Java内部创建View时完成.如果它在XML之前定义,则无法动态更改样式.

  • 这如何回答你自己的问题? (7认同)