我已经为 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))
}
}
}
}
这很可能是由于 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
情况)。