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

时间:2011-02-19 15:52:30

标签: android

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

5 个答案:

答案 0 :(得分:33)

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

  1. 定义属性
  2. 创建您要使用的样式
  3. 在我们的主题上为该属性应用样式
  4. 使用该属性创建视图的新实例
  5. 在'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, 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,但是视图的名称绝不需要与样式或属性或任何东西相匹配。此外,此技术应该适用于任何自定义视图,而不仅仅是TextViews。

答案 1 :(得分:12)

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

您可以使用全新的Paris库以编程方式应用样式:

Paris.style(yourView).apply(condition ? R.style.Green : R.style.Red);

唯一需要注意的是,并非所有属性都受支持(但是很多属性和支持可以通过为库提供相当容易的方式添加)。

免责声明:我是该图书馆的原作者。

答案 4 :(得分:-1)

把这段代码

super.setStyle(R.style.yourownstyle)

在onCreate

中的setContentView()之前