撰写材质主题未给出正确的颜色

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

我已经为 Jetpack Compose 主题设置了自定义颜色,但是当我调用

MaterialTheme.colorScheme.primary
时,它给了我默认的紫色。

val primaryLight = Color(0xFF1F6A4E)

private val lightScheme = lightColorScheme(
    primary = primaryLight
)

@Composable
fun AppTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    // Dynamic color is available on Android 12+
    dynamicColor: Boolean = true,
    content: @Composable () -> Unit
) {
    val colorScheme = when {
        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
            val context = LocalContext.current
            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
        }

        darkTheme -> darkScheme
        else -> lightScheme
    }

    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography,
        content = content
    )
}

用法如下:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContent {
            AppTheme{
                Box(
                    Modifier
                        .fillMaxSize()
                        .background(MaterialTheme.colorScheme.primary))
            }
        }
    }
}

Screenshot

android kotlin android-jetpack-compose material-design
1个回答
0
投票

这很可能是由于 Android 12(API 版本 31)引入了动态颜色

如果你看看你的主题,你会发现在 when 声明中实际上有

情况:

  • dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
  • darkTheme
  • else

如果在主题中激活了动态颜色 (

dynamicColor
) 并且应用程序当前在支持动态颜色 (
Build.VERSION_CODES.S
) 的设备上运行,则它将跳过您明确定义的
lightScheme
darkScheme
并使用动态调色板相反。

您可以尝试在 API 级别为 30 或以下的设备上运行您的应用程序以查看差异。

如果您想停用动态颜色(无论 API 级别如何),以便始终使用您的

lightScheme
,请相应地设置
AppTheme
的参数:

AppTheme(dynamicColor = false) {
    Box(
        Modifier
            .fillMaxSize()
            .background(MaterialTheme.colorScheme.primary)
    )
}

或者,您也可以默认将参数声明为

false
或完全删除它(以及第一个
when
情况)。

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