You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11(小米Redmi)Jetpack Compose文本颜色消失问题求助

问题:Jetpack Compose 文本颜色在Android 11小米设备上异常

在搭载Android 11(API 30)的小米Redmi设备上,使用Jetpack Compose开发的应用出现文本颜色异常:应用启动时文本显示为白色(预期为黑色),点击按钮返回该界面后颜色恢复正常。已尝试在Composable组件中显式设置Color.Black,也在XML主题中配置默认文本颜色为黑色,但问题仍未解决。


相关代码

自定义Text Composable

@Composable
fun TinyCenterText(text: String) {
    Text(
        color = Color.Black,
        text = text,
        textAlign = TextAlign.Center,
        fontSize = 12.sp
    )
}

XML主题配置

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.MobileSDK" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
        <item name="android:textColor">@color/black</item>

    </style>
</resources>

MainActivity 导航相关代码

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    ...
    setContent {
        Scaffold(
            topBar = {
            TopAppBar(...)
            }
    ){ innerPadding ->
            NavHost(navController, startDestination = NavigationRoutes.MAIN.route) {
                composable(NavigationRoutes.MAIN.route) {
                    screenName = "Main Screen"

                    resetData()

                    Box(modifier = Modifier.padding(innerPadding)) {
                        MainScreen(navController)
                    }
                }
                composable(NavigationRoutes.SPACE.route) {
                    screenName = "Space Screen"

                    Box(modifier = Modifier.padding(innerPadding)) {
                        SpaceScreen(navController)
                    }
                }
...
}

...

MainScreen 代码

@Composable
fun MainScreen(navController: NavController) {
//... 数据获取与处理相关函数,无UI/主题相关逻辑
...
    MainFragmentView(
        space = activeSpace,
        transaction = activeTransaction,
        theme = activeTheme,
        latestActiveTransaction = latestActiveTransaction,
        sdkResult = paymentResult,
        onChangeSpace = { navController.navigate(NavigationRoutes.SPACE.route) },
        onChangeTransaction = { navController.navigate(NavigationRoutes.TRANSACTION.route) },
        onChangeTheme = { isLight -> navController.navigate("${NavigationRoutes.THEME.route}/${isLight}") },
        onCreateTransaction = ::createTransaction,
        onPay = ::onPay,
        isLoading = isTransactionLoading,
        showPayDialog = showPayDialog,
        logText = logText
    )

解决建议

  1. 换用适配Compose的主题
    当前XML主题继承的Theme.MaterialComponents.DayNight.DarkActionBar和Compose兼容性一般,试试换成Theme.MaterialComponents.DayNight.NoActionBar,或者直接在setContent里用Compose的MaterialTheme明确指定颜色:

    setContent {
        MaterialTheme(
            colorScheme = lightColorScheme(
                onSurface = Color.Black
            )
        ) {
            Scaffold(/* 原TopBar和内容 */)
        }
    }
    
  2. 排查首次渲染的状态问题
    启动时异常、返回后正常,大概率是首次加载时UI状态没初始化好。看看resetData()会不会干扰UI渲染,或者把MainScreen里的数据获取逻辑放到LaunchedEffect里,确保数据加载完再渲染:

    @Composable
    fun MainScreen(navController: NavController) {
        LaunchedEffect(Unit) {
            // 把原来的数据获取/处理逻辑移到这里
        }
        // 后续UI渲染代码
    }
    
  3. 禁用小米的强制深色模式
    小米部分系统会强制给应用套深色主题,导致文本颜色反转。在AndroidManifest的MainActivity里加android:forceDarkAllowed="false":

    <activity
        android:name=".MainActivity"
        android:forceDarkAllowed="false">
    </activity>
    
  4. 绑定主题颜色而非硬编码
    虽然你已经写了Color.Black,但试试用MaterialTheme.colorScheme.onSurface代替,这样颜色会跟着主题走,也能避免被系统逻辑覆盖:

    @Composable
    fun TinyCenterText(text: String) {
        Text(
            color = MaterialTheme.colorScheme.onSurface,
            text = text,
            textAlign = TextAlign.Center,
            fontSize = 12.sp
        )
    }
    

内容的提问来源于stack exchange,提问作者Lukáš Šálek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:43:18