为何NavigationSuiteScaffoldLayout标签显示数字而非声明的字符串资源
问题解决:Jetpack Compose导航标签显示数字而非字符串
问题原因
你在代码里直接对@StringRes标记的资源ID调用toString()方法(比如appDestinations.label.toString()),这种操作只会输出资源ID的数字值,而不是对应的字符串内容。
解决方案
用Jetpack Compose提供的stringResource()函数解析资源ID,这个函数能在Composable上下文里把资源ID转换成对应字符串。
核心代码修正
修正NavigationRailItem部分
NavigationRailItem( selected = selectedItem == index, onClick = { selectedItem = index }, icon = { Icon( imageVector = appDestinations.icon, contentDescription = stringResource(appDestinations.contentDescription) ) }, label = { Text(text = stringResource(appDestinations.label)) } )
修正NavigationSuite的item部分
item( selected = selectedItem == index, onClick = { selectedItem = index }, icon = { Icon( imageVector = appDestinations.icon, contentDescription = stringResource(appDestinations.contentDescription) ) }, label = { Text(text = stringResource(appDestinations.label)) } )
完整修改后的MainActivity代码
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeToEdge() setContent { MyAdaptiveApplicationTheme { var selectedItem by remember { mutableIntStateOf(0) } val navSuiteType = NavigationSuiteScaffoldDefaults.calculateFromAdaptiveInfo(currentWindowAdaptiveInfo()) NavigationSuiteScaffoldLayout( navigationSuite = { // Custom Navigation Rail with centered items. if (navSuiteType == NavigationSuiteType.NavigationRail) { NavigationRail { AppDestinations.entries.forEachIndexed { index, appDestinations -> NavigationRailItem( selected = selectedItem == index, onClick = { selectedItem = index }, icon = { Icon( imageVector = appDestinations.icon, contentDescription = stringResource(appDestinations.contentDescription) ) }, label = { Text(text = stringResource(appDestinations.label)) } ) } } } else { NavigationSuite { AppDestinations.entries.forEachIndexed { index, appDestinations -> item( selected = selectedItem == index, onClick = { selectedItem = index }, icon = { Icon( imageVector = appDestinations.icon, contentDescription = stringResource(appDestinations.contentDescription) ) }, label = { Text(text = stringResource(appDestinations.label)) } ) } } } } ) { // Screen content. Text( modifier = Modifier.padding(16.dp), text = "Current NavigationSuiteType: $navSuiteType" ) } } } } }
补充说明
stringResource()是Compose专门用于访问字符串资源的API,会自动根据当前语言环境加载对应字符串。Icon的contentDescription同样需要用stringResource()处理,不能直接toString(),这是保证无障碍功能正常的必要操作。
内容的提问来源于stack exchange,提问作者wbk727
相关产品推荐
相关产品推荐

