我有一个白色背景的应用程序小部件。一些显示的文本使用 ?android:textColorPrimary
,一些使用 ?android:textColorSecondary
,还有一些使用我定义的颜色。
但出于某种原因,当我在 pre Nougat(24 位或更低版本)上运行我的应用程序时,颜色为白色,因此文本在白色背景上不可见,但 24 位及更高版本显示为黑色或灰色。我定义的颜色总是可以的。
同样有趣的是,应用程序小部件中的代码几乎与实际应用程序相同(均显示项目列表)并且应用程序版本(即使在这些较旧的 API 上)使用深色,但出于某种原因小部件选择文本为白色。
如果我跟踪样式中的 XML 代码,我会得到:
<!-- The most prominent text color. -->
<attr name="textColorPrimary" format="reference|color" />
这是什么意思?它如何知道最突出的文本颜色是什么?为什么它在小部件和应用程序中有所不同,为什么只在较旧的 API 版本上有所不同?
我能做些什么来解决这个问题以使其保持一致吗?我正在使用相同的主题。为什么会这样?
注意:就设置特定颜色而言,这不是我要问的。当然,我可以将文本设置为黑色或其他颜色,但我想使用这些样式,以便将来可以根据需要更改颜色,尤其是因为我使用的是日/夜主题。也许与此有关?好的,我尝试了一个普通的主题,但问题仍然存在(文本在小部件上不可见 - 只有小部件 - 在 API 24 之前)。
如果有任何不清楚的地方,请告诉我,我会更新问题。谢谢。
最佳答案
What does this (textColorPrimary) mean?
这意味着,将应用当前主题的 android:textColorPrimary
中指定的值。所以,如果你在 xml 中声明了一个 TextView
并且应用了 android:textColor="?android:textColorPrimary"
,那么这个属性将从主题中获取此布局正在膨胀的当前上下文。
How does it know what the most prominent text colour is?
它从您应用到您的 Activity 的主题或从 View 被膨胀的上下文中获取该值(参见 ContextThemeWrapper
和 android:theme
).它可能因平台版本而异。根据您使用的主题,它可能会有所不同,see themes.xml
.
您可以在主题中覆盖该属性:
<style name="AppTheme" parent="...">
...
<item name="android:textColorPrimary">@color/someColor</item>
</style>
现在,您已经成功覆盖了 android:textColorPrimary
属性,因此此后任何使用此主题的上下文膨胀的 View 在引用 ?android:textColorPrimary 时都会看到这个覆盖的值
。
Why is it different in the widget vs the app, and why only on older API versions?
您的小部件可能已使用特定主题进行了扩充,而应用具有不同的主题。如果他们有相同的主题 - 这些属性将是相同的。
关于android - 为什么?android :textColorPrimary get different values with different API versions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45657033/