为什么?android:textColorPrimary使用不同的API版本获取不同的值?

时间:2017-08-13 04:21:28

标签: android android-resources android-theme android-styles android-inflate

我有一个白色背景的app小部件。部分显示的文字使用?android:textColorPrimary,有些使用?android:textColorSecondary,有些则使用我定义的颜色。

出于某种原因,当我在前牛轧糖(24或更低)上运行我的应用程序时,颜色为白色,使得文本在白色背景上不可见,但24和更高的任何内容显示为黑色或灰色。我定义的颜色总是好的。

还有趣的是,app小部件中的代码几乎与实际应用程序中的代码相同(均显示项目列表),应用程序版本(即使在这些较旧的API上)也使用黑暗颜色,但小部件由于某种原因为文本选择白色。

如果我通过我得到的样式中的XML代码进行跟踪:

    <!-- The most prominent text color.  -->
    <attr name="textColorPrimary" format="reference|color" />

这是什么意思?它是如何知道最突出的文字颜色是什么?为什么小部件与应用程序不同,为什么只有较旧的API版本?

我能做些什么来解决这个问题,以便它保持一致吗?我使用相同的主题。为什么会这样?

注意:就设置特定颜色而言,这不是我所要求的。当然我可以将文本设置为黑色或其他东西,但我想使用这些样式,以便将来颜色可以根据需要改变,特别是因为我使用日/夜主题。也许它与此相关?好的我尝试了一个普通的主题,但问题仍然存在(文本在窗口小部件上是不可见的 - 只有窗口小部件 - 比早于API 24的版本)。

如果有任何不清楚的地方,请告诉我,我会更新问题。感谢。

2 个答案:

答案 0 :(得分:1)

  

这(textColorPrimary)是什么意思?

这意味着,将应用当前主题android:textColorPrimary中指定的值。因此,如果您已在xml中声明了TextView并且已向其应用android:textColor="?android:textColorPrimary",那么此属性将从当前上下文的主题中获取,此布局将通过该主题膨胀。

  

它如何知道最突出的文字颜色是什么?

它从您已应用于您的活动的主题或从视图膨胀的上下文中获取该值(请参阅ContextThemeWrapperandroid:theme)。它可能因平台版本而异。根据您使用的主题,它可能会有所不同,see themes.xml

您可以在主题中覆盖该属性:

<style name="AppTheme" parent="...">
    ...
    <item name="android:textColorPrimary">@color/someColor</item>
</style>

现在,您已成功覆盖android:textColorPrimary属性,因此此后,在引用?android:textColorPrimary时,任何使用此主题的上下文夸大的视图都会看到此覆盖的值。

  

为什么小部件与应用程序不同,为什么只有较旧的API版本?

您的小部件可能已使用特定主题进行了充气,​​而应用具有不同的主题。如果它们具有相同的主题 - 那些属性将是相同的。

答案 1 :(得分:0)

嗯,?android:textColorPrimary?android:textColorSecondary是属性,它们由系统解析。他们可以在不同的平台上使用它们,因为你可以参考Android属性。

如果您想自己定义它们,您需要创建自己的主题并将值放在那里。