以编程方式应用样式资源

时间:2011-09-21 12:31:56

标签: android

我没有办法以编程方式执行此操作,因此我在此处发布此问题(我也没有发现任何与此相关的问题)。

我有一个资源样式,在res / values / styles.xml中定义。我想要做的是使用java将我的活动中的这个样式应用到我正在操作的View对象。

是否可以在Android中实现此功能,或者样式只能使用android:style属性应用于对象?

4 个答案:

答案 0 :(得分:5)

分享了这个答案here,但由于这有自己的会话话题,我觉得这里也是相关的。

这个问题没有一线解决方案,但这适用于我的用例。问题是,'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) {
           super(context, null, R.attr.customTextView);
        }
    }
    

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

答案 1 :(得分:3)

不,通常无法将样式资源应用于现有的View实例。样式资源只能在构建期间应用于视图。

要了解原因,请研究View(Context context, AttributeSet attrs, int defStyle)构造函数。这是唯一一个读取中心View属性(如android:background)的地方,因此在构建View之后无法应用样式。相同的模式用于View的子类,如TextView。您需要使用setter手动应用样式属性。

请注意,如果您以progamatically方式实例化View,则可以通过defStyle构造函数参数使用任何样式资源。

答案 2 :(得分:2)

不,这是不可能的。通常用于从/ res /目录访问任何内容的Resources类不支持获取样式。 http://developer.android.com/reference/android/content/res/Resources.html

- 更新 -

我在这里所说的并不完全正确。你可以在View这样的对象的构造函数中给出一个样式:View(Context context, AttributeSet attrs, int defStyle),也像crnv对某些View实现所说的那样

答案 3 :(得分:2)

至少对于TextView,可以使用setTextAppearance(context, resid)方法。样式的resId可以在R.style.下找到。