【问题标题】:How to get text color for current theme in android?如何在android中获取当前主题的文本颜色?
【发布时间】:2020-03-11 18:16:02
【问题描述】:

我正在尝试在我的 Java 代码中检索文本颜色

    TypedValue typedValue = new TypedValue();
    context.getTheme().resolveAttribute(android.R.attr.textColor, typedValue, true);
    int color = typedValue.data;

参考thisthis 问题。

但我总是得到 1637,但是当我在 textview Shader textView.getPaint().setShader(Gradient...) 上设置它时,这种颜色看起来是透明的。

如何解决?

【问题讨论】:

    标签: java android


    【解决方案1】:

    我们习惯于看到以十六进制形式表示的颜色,例如 #RRGGBB#AARRGGBB。但是,这些十六进制代码只是数字,您看到的是颜色值的十进制表示。

    如果您在输出中使用Color.valueOf(),您应该能够以您期望的方式获得有关颜色的更多信息。对我来说,我想看?colorAccent的值,所以我写了这个:

    val typedValue = TypedValue()
    theme.resolveAttribute(R.attr.colorAccent, typedValue, true)
    val color = Color.valueOf(typedValue.data)
    println(color)
    

    这是输出:

    Color(0.84705883, 0.105882354, 0.3764706, 1.0, sRGB IEC61966-2.1)
    

    这告诉我,我的颜色是 84.7% 红色、10.6% 绿色、37.6% 蓝色和 100% 不透明度。我也可以使用快速扩展的方法来获取十六进制值:

    private fun Color.toHexString(): String =
        String.format("#%08X", toArgb())
    

    这给了我十六进制字符串#FFD81B60,它与我在颜色文件中看到的相匹配(尽管我指定它时没有使用 Alpha 通道)。


    如果我用你的输出 (1637) 运行我的代码,我会得到:

    Color(0.0, 0.023529412, 0.39607844, 0.0, sRGB IEC61966-2.1)
    
    (#00000665)
    

    这告诉我你的颜色是 0% 的红色、2.4% 的绿色和 39.6% 的蓝色......但它也是 0% 的不透明。这与您在着色器中使用此颜色时将其视为透明的事实相符。

    【讨论】:

    • Color.valueOf 需要 API 26,我支持 API 19 +
    • 您不需要在生产应用程序中实际使用Color.valueOf()。它旨在帮助说明问题。
    • 他的回答解决了问题,甚至解释了,你为什么不给它打勾?
    • 不,它不能解决问题。我的回答中解释了问题和答案。我的回答也不完整。它只说需要使用字符串颜色,但没有解释在使用十六进制颜色的引用时如何获取颜色,例如@android:color/white
    【解决方案2】:

    如果我运行您的代码,每次更改样式文件中的颜色时都会返回不同的值。 例子:

    -15658735 为十六进制颜色 #111111

    -16777216 为十六进制颜色 #000000

    -1 表示十六进制颜色 #ffffff

    所以它正在工作,但我不知道该颜色是如何“格式化”的。也许它只是对包含实际颜色代码的样式值的某种引用。 如果我像这样运行您的代码,它确实会以应有的方式更改文本颜色。

    TypedValue typedValue = new TypedValue();
    getTheme().resolveAttribute(android.R.attr.colorAccent, typedValue, true);
    int color = typedValue.data;
    TextView textView = findViewById(R.id.textView);
    textView.setTextColor(color);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-05
      • 2012-05-08
      • 1970-01-01
      • 2019-03-07
      • 2017-01-13
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      相关资源
      最近更新 更多