如何修复 XML+Compose 应用程序内动态颜色的奇怪行为?

问题描述 投票:0回答:2

我用 XML 和 Jetpack Compose 编写了单屏。在主屏幕上,我有两个按钮用于不同的屏幕实现。在 Jetpack Compose 实现中,动态颜色适用于不同的设备和不同的设置。但对于 XML 实现,我有很多问题和奇怪的颜色行为。

我在此设备上测试了动态颜色:

  1. 三星 s21 Android 12 One UI 4.0

  2. 三星 s21 Android 14 One UI 6.0

  3. 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 中实现动态颜色的存储库,请给我一个链接。

android xml material-ui android-jetpack-compose
2个回答
0
投票

我找到了解决办法。我的主题文件:

<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 预览以及我的应用程序现在都很好。


0
投票

正如 Denis 所说,降级到 1.10.0,动态颜色就会起作用。我使用的是 1.11.0,降级后他们只在模拟器上工作,他们工作得很好

© www.soinside.com 2019 - 2024. All rights reserved.