撰写主题不一致的行为

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

我的应用程序中有一个主题,如下所示:

//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 提供)。

android android-jetpack-compose android-theme
1个回答
0
投票

有一点不是 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,或类似根组件的东西。

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