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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 20:15:17