Java 如何在android中获取当前主题的文本颜色?

Java 如何在android中获取当前主题的文本颜色?,java,android,Java,Android,我试图在Java代码中检索文本颜色 TypedValue typedValue = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.textColor, typedValue, true); int color = typedValue.data; 参考文献和问题 但是一直以来我都得到1637,但是当我在textview着色器上设置它时,textview.getPaint().se

我试图在Java代码中检索文本颜色

    TypedValue typedValue = new TypedValue();
    context.getTheme().resolveAttribute(android.R.attr.textColor, typedValue, true);
    int color = typedValue.data;
参考文献和问题

但是一直以来我都得到1637,但是当我在textview着色器上设置它时,
textview.getPaint().setShader(Gradient…
这个颜色看起来是透明的


如何解决这个问题?

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

-15658735用于hexcolor#111111

-16777216用于hexcolor#000000

-1个用于hexcolor#ffffff

所以它是有效的,但我不知道颜色是如何“格式化”的。也许它只是对包含实际颜色代码的styles值的某种引用。 如果我像这样运行你的代码,它会改变文本的颜色

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);

我们习惯于看到以十六进制形式表示的颜色,如
#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()。他的回答解决了问题,甚至解释了问题,你为什么不打勾?不,它解决不了问题。问题和答案在我的答案中有解释。我的回答也不完整。它只是说需要使用字符串颜色,但没有解释在使用reference而不是hex color时如何获取颜色,例如@android:color/white您能帮我吗-