【问题标题】:Applying style resource programmatically以编程方式应用样式资源
【发布时间】:2017-08-14 12:56:44
【问题描述】:

我没有找到以编程方式执行此操作的方法,所以我在这里发布了这个问题(我也没有找到与这个问题相关的任何问题)。

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

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

【问题讨论】:

    标签: android


    【解决方案1】:

    分享了这个答案here,但由于它有自己的对话线程,我觉得它在这里也很相关。

    这个问题没有单一的解决方案,但这适用于我的用例。问题是,'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>    
    

    在 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。

    【讨论】:

      【解决方案2】:

      不,不可能将样式资源普遍应用于现有的 View 实例。样式资源只能在构建期间应用于视图。

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

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

      【讨论】:

      • 我没有以编程方式实例化视图。它是我创建的扩展 LinearLayout 的自定义视图...所以我不想让用户使用 style="@style/...",而是希望以编程方式应用样式,但使用样式资源而不是以编程方式应用此现有样式中的属性。
      • "请注意,如果您以编程方式实例化视图,则可以通过 defStyle 构造函数参数使用任何样式资源。"你做过吗?我遇到了问题,在搜索时我发现了这个。 code.google.com/p/android/issues/…
      【解决方案3】:

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

      【讨论】:

      • 好吧,实际上我需要为整个视图应用样式...例如 LinearLayout 或 RelativeLayout。
      • 视图创建后无法更改,但可以为视图类的构造函数提供自定义样式。 link
      【解决方案4】:

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

      -- 更新--

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

      【讨论】:

        猜你喜欢
        • 2016-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多