Android 11(小米Redmi)Jetpack Compose文本颜色消失问题求助
在搭载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 )
解决建议
换用适配Compose的主题
当前XML主题继承的Theme.MaterialComponents.DayNight.DarkActionBar和Compose兼容性一般,试试换成Theme.MaterialComponents.DayNight.NoActionBar,或者直接在setContent里用Compose的MaterialTheme明确指定颜色:setContent { MaterialTheme( colorScheme = lightColorScheme( onSurface = Color.Black ) ) { Scaffold(/* 原TopBar和内容 */) } }排查首次渲染的状态问题
启动时异常、返回后正常,大概率是首次加载时UI状态没初始化好。看看resetData()会不会干扰UI渲染,或者把MainScreen里的数据获取逻辑放到LaunchedEffect里,确保数据加载完再渲染:@Composable fun MainScreen(navController: NavController) { LaunchedEffect(Unit) { // 把原来的数据获取/处理逻辑移到这里 } // 后续UI渲染代码 }禁用小米的强制深色模式
小米部分系统会强制给应用套深色主题,导致文本颜色反转。在AndroidManifest的MainActivity里加android:forceDarkAllowed="false":<activity android:name=".MainActivity" android:forceDarkAllowed="false"> </activity>绑定主题颜色而非硬编码
虽然你已经写了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

