【问题标题】:How to use theme attribute as color selector如何使用主题属性作为颜色选择器
【发布时间】:2015-01-25 19:39:54
【问题描述】:

我想为我的文本字段定义一个颜色状态列表,在“激活”时默认使用 primaryTextColor 和 colorAccent。我的定义:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:color="?android:attr/colorAccent" android:state_activated="true"/>

    <item android:color="?android:attr/textColorPrimary"/>

</selector>

这不起作用(我总是得到一些红色,我猜这是将 id 解释为 argb 颜色)。

我可以做些什么来指定与主题相关的颜色?

【问题讨论】:

    标签: android android-styles


    【解决方案1】:

    我相信现在通过 XML 是不可能的。我知道 Android 框架仅在 Lollipop 的可绘制资源中添加了对主题属性的支持,并且它在 API 21 以下不起作用。我相信颜色资源从未得到支持。

    但是,您可以通过代码做到这一点!

    final TypedArray attributes =
            itemView.getContext().obtainStyledAttributes(R.styleable.WowSdkSongViewHolder);
    try {
        int colorAccent =
                attributes.getColor(R.styleable.WowSdkSongViewHolder_colorAccent, 0);
        final int textColorPrimary = attributes.getColor(
                R.styleable.WowSdkSongViewHolder_android_textColorPrimary, 0);
    
        title.setTextColor(new ColorStateList(
                new int[][] { ThemeUtils.ACTIVATED_STATE_SET, ThemeUtils.EMPTY_STATE_SET },
                new int[] { colorAccent, textColorPrimary }));
    } finally {
        attributes.recycle();
    }
    

    首先,您需要像往常一样获取当前主题中的属性值。然后你必须创建一个ColorStateList 对象。构造函数接受一个状态列表数组(实际上是状态数组,就是int[][])和一个相应颜色的数组。然后你可以在你的TextView 上设置这个ColorStateList 并带有setTextColor 重载。

    AppCompat 在ThemeUtils 中定义了一些方便的常量。但是,这个类是隐藏的并且在一个内部包中,所以我建议将你需要的内容复制到你自己的ThemeUtils

    【讨论】:

      【解决方案2】:

      我知道这是一篇旧帖子,但仍然如此。如果您的最低版本是 API 23 或更高版本,您可以使用主题属性甚至 alpha 属性。

      来自official documentation

      每个项目必须定义一个 android:color 属性,可以是 HTML 样式的十六进制颜色,对颜色资源的引用,或 -- 在 API 23 中 及以上——解析为颜色的主题属性。

      从 API 23 开始,项目可以选择定义一个 android:alpha 属性来修改基色的不透明度。该属性采用 介于 0 和 1 之间的浮点值或主题属性 这样解决。项目的整体颜色由下式计算 将基色的 Alpha 通道乘以 Alpha 值。

      【讨论】:

        猜你喜欢
        • 2019-07-08
        • 1970-01-01
        • 2017-06-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多