我的应用程序中有一个主题,如下所示:
//use light colors for dark mode
private val ConceptualSystemsDarkColorScheme = darkColorScheme(
primary = Yellowish,
secondary = YellowishBright,
tertiary = Orangeish,
background = Color.Black,
surface = Color.Black,
onBackground = Color.Black,
)
//use dark colors for light mode
private val ConceptualSystemsLightColorScheme = lightColorScheme(
primary = DarkYellowish,
secondary = DarkYellowishDim,
tertiary = DarkOrangeish,
background = Yellowish,
surface = Yellowish,
onBackground = Yellowish,
)
@Composable
fun ConceptualSystemsTheme(
useDarkTheme: Boolean = false, //never use Dark theme
dynamicColor: Boolean = false,
content: @Composable () -> Unit
) {
val logger = LoggerFactory.getLogger("Theme")
val colorScheme = when {
dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
logger.info("THEME: found build version : "
+ Build.VERSION.SDK_INT + " >= " + Build.VERSION_CODES.S
+ " : opting for dynamic system color scheme...")
val context = LocalContext.current
if(useDarkTheme) {
logger.info("Using dark dynamic color scheme")
dynamicDarkColorScheme(context)
} else {
logger.info("Using light dynamic color scheme")
dynamicLightColorScheme(context)
}
}
useDarkTheme -> {
logger.info("Using dark color scheme")
ConceptualSystemsDarkColorScheme
}
else -> {
logger.info("Using light color scheme")
ConceptualSystemsLightColorScheme
}
}
MaterialTheme(
shapes = MaterialTheme.shapes.copy(
RoundedCornerShape(6.dp)
),
colorScheme = colorScheme,
typography = DefaultTypography,
content = content
)
}
看起来很简单……但是,我得到的结果好坏参半。我照常调用主题:
setContent {
ConceptualSystemsTheme {
MainLayout(keepDriverNumber.collectAsState(initial = false))
}
}
在一个 Activity 中,背景为黄色,正如预期的那样。在另一个活动中,背景是黑色的,在另一个活动中,背景的一半是黄色的,惰性列下的下半部分是黑色的。为什么主题行为如此不一致? Logcat显示每次都使用浅色主题,但是每个Activity的背景都不同...(顺便说一下,测试系统运行的是Android 9,因此动态主题不是一个因素(已确认)由 Logcat 提供)。
有一点不是 100% 清楚的是你所说的活动是什么意思?如果您有两项不同的活动,您应该为这两项活动设置主题,但我想您已经这样做了。您应该知道的另一件事是并非所有元素都采用背景颜色。例如
TestTheme {
Column {
Box(modifier = Modifier.fillMaxHeight(0.3f)) {
Text(modifier = Modifier.align(Alignment.Center), text = "Box")
}
Scaffold(
modifier = Modifier
.fillMaxHeight(0.4f)
) { innerPadding ->
Text(text = "scafold")
}
}
}
将生成这样的用户界面:
在 Jetpack Compose 中,Scaffold 会自动将主题的颜色应用于其组件,例如应用栏、浮动操作按钮等。但是,诸如 Column、Row、Box 等布局可组合项没有默认背景。它们是布局容器,本身不渲染任何可见的内容。所以也许最简单的解决方案是使用 Surface 或 Scaffold,或类似根组件的东西。