Android Studio Android虚拟设备正在使用默认的Material3主题,但应应用自定义主题

ccgok5k5  于 2023-10-23  发布在  Android
关注(0)|答案(1)|浏览(132)

问题

我已经为这个问题纠结了好几天了。
Android Studio的AVD似乎只为我的应用程序使用默认的Material3主题。我在不同的机器上使用相同的代码对这个特定的AVD配置没有问题,所以我只能假设这个问题与硬件有关,因为它在我的新硬件上不能正常工作。

失败解决方案

我测试了几种不同AVD的默认配置。Pixel 7 Pro、Pixel 6 Pro、Pixel 4和Nexus 6,均为API 33。我还手动编辑了与几个AVD相关的config.ini文件,以使用主机图形,但无济于事。我甚至恢复到应用程序的master分支上的旧代码,我可以肯定地确认在硬件更改之前它是工作的。
此外,我允许根据系统是处于亮模式还是暗模式来选择主题,这似乎也无所谓。
预览工作正常。
在Android Studio中或gradle构建过程中均不存在任何警告。
在Android Studio Giraffe 2022.3.1上

硬件

新硬件是Intel i7 3700k,RTX 4060 8GB GDDR6。我可以根据要求提供更详细的信息。

应用程序

我将在下面展示一些代码。请记住,这段代码被确认为具有在不同硬件上应用自定义主题的预期结果,因此我将省略许多细节。材料设计的较小版本不是已建立的依赖关系。

@Composable
fun App ( finish: () -> Unit ) {
    val navController = rememberNavController()
    AppTheme(
        useDarkTheme = true
    ) {
        AppFrame(
            navController = navController
        ){
            NavGraph(navController = navController)
        }
    }
}

主题

@Composable
fun AppTheme(
    useDarkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit
) {

    val colors = if (!useDarkTheme) {
        LightAltColors
    } else {
        DarkAltColors
    }

    MaterialTheme(
        colorScheme = colors,
        typography = AppTypography,
        content = content
    )

    val systemUiController = rememberSystemUiController()
    systemUiController.setSystemBarsColor(MaterialTheme.colorScheme.surface)
    systemUiController.setNavigationBarColor(
        MaterialTheme.colorScheme.surfaceColorAtElevation(NavigationBarDefaults.Elevation)
    )

    content()

}
6qqygrtg

6qqygrtg1#

原来我错了。第二次调用content lambda参数在其上绘制内容,该内容使用默认的Material主题进行主题化。
单位:theme.kt

@Composable
fun AppTheme(
    useDarkTheme: Boolean = isSystemInDarkTheme(),
    content: @Composable () -> Unit
) {

    val colors = if (!useDarkTheme) {
        LightAltColors
    } else {
        DarkAltColors
    }

    MaterialTheme(
        colorScheme = colors,
        typography = AppTypography,
        content = content
    )

    val systemUiController = rememberSystemUiController()
    systemUiController.setSystemBarsColor(MaterialTheme.colorScheme.surface)
    systemUiController.setNavigationBarColor(
        MaterialTheme.colorScheme.surfaceColorAtElevation(NavigationBarDefaults.Elevation)
    )

    // This line breaks it by calling the content *on top of the themed content*
    // Still unclear exactly why preview looked right in this instance.
    // content()

}

相关问题