android - 为什么?android :textColorPrimary get different values with different API versions?

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

我有一个白色背景的应用程序小部件。一些显示的文本使用 ?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 被膨胀的上下文中获取该值(参见 ContextThemeWrapperandroid: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/

相关文章:

Android应用程序启动源

android - 从 Assets 文件夹或可绘制图像加载图像?

android - 当我将图像放入可绘制文件夹时,为什么 BitmapFactory.decodeResource() 会变慢?

android - 从特定主题中选择 Spinner

android - 为什么按钮没有 Material 触摸反馈?

android - 即使我将 API 设置为 14,也无法使用 Theme.Holo.Light

Android 旋转 MapView

android - Flutter:尝试在 Android 上使用 map_view 显示交互式 map 时应用程序崩溃

android - 所有通知都来自服务器?

android - 从 android 项目中删除所有未使用的资源