我用 XML 和 Jetpack Compose 编写了单屏。在主屏幕上,我有两个按钮用于不同的屏幕实现。在 Jetpack Compose 实现中,动态颜色适用于不同的设备和不同的设置。但对于 XML 实现,我有很多问题和奇怪的颜色行为。
我在此设备上测试了动态颜色:
三星 s21 Android 12 One UI 4.0
三星 s21 Android 14 One UI 6.0
Pixel 7 Android 14(ADB 设备)
我在下面提供了我的应用程序的一些主要代码方面。
颜色.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<color name="background_card_color">#FFF2F2F4</color>
<color name="gray_color">#BFC6CE</color>
<color name="orange_color">#EF8251</color>
<color name="background_black_card_color">#181818</color>
// Light dynamic
// Primary
<color name="md_theme_light_primary">@color/orange_color</color>
<color name="md_theme_light_primaryContainer">@color/orange_color</color>
...
// Night dynamic
// Primary
<color name="md_theme_dark_primary">@color/orange_color</color>
<color name="md_theme_dark_primaryContainer">@color/orange_color</color>
...
</resources>
在 XML 文件中,我设置动态颜色如下:
android:background="?attr/colorSurface"
在自定义视图中,我得到如下动态颜色:
val typedValue = TypedValue()
val theme = context.theme
val colorPrimaryResId = com.google.android.material.R.attr.colorOnSecondaryContainer
theme.resolveAttribute(colorPrimaryResId, typedValue, true)
val colorOnSecondaryContainer = ContextCompat.getColor(context, typedValue.resourceId)
我的主题.xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="AppCompat" parent="Theme.Material3.DynamicColors.Light">
<item name="android:windowTranslucentStatus">false</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
// Dynamic colors
<item name="colorPrimary">@color/md_theme_light_primary</item>
<item name="colorPrimaryContainer">@color/md_theme_light_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_light_onPrimaryContainer</item>
...
</style>
</resources>
现在我提供一些不同设备上不同参数的XML屏幕实现的截图。
动态颜色关闭
三星 s21 Android 12
三星 s21 Android 14
Pixel 7 Android 14
动态颜色开启
我得到了同样的结果。我在 XML 屏幕实现方面做错了什么?如果您有一些在 XML 中实现动态颜色的存储库,请给我一个链接。
我找到了解决办法。我的主题文件:
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="AppCompat" parent="Theme.Material3.Dark.NoActionBar">
<item name="android:windowTranslucentStatus">false</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:windowLightStatusBar">true</item>
<item name="android:forceDarkAllowed" tools:targetApi="q">false</item>
<item name="colorPrimary">@color/md_theme_dark_primary</item>
<item name="colorPrimaryContainer">@color/md_theme_dark_primaryContainer</item>
<item name="colorOnPrimaryContainer">@color/md_theme_dark_onPrimaryContainer</item>
<item name="colorSecondary">@color/md_theme_dark_secondary</item>
<item name="colorSecondaryContainer">@color/md_theme_dark_secondaryContainer</item>
<item name="colorOnSecondaryContainer">@color/md_theme_dark_onSecondaryContainer</item>
<item name="colorSurface">@color/md_theme_dark_surface</item>
<item name="colorOnSurface">@color/md_theme_dark_onSurface</item>
</style>
主要部分是我将材质库从 1.11.0 降级到 1.10.0。一切正常。动态颜色的 XML 预览以及我的应用程序现在都很好。
正如 Denis 所说,降级到 1.10.0,动态颜色就会起作用。我使用的是 1.11.0,降级后他们只在模拟器上工作,他们工作得很好