如何在密封类中获取字符串资源值以实现顶部栏动态标题?
解决方案
问题出在你直接把资源ID转成了字符串(R.string.app.toString()),这只会输出资源ID的数字值,而不是对应的字符串内容。密封类初始化时无法获取Android上下文,所以不能直接在这里解析字符串资源,正确的做法是在密封类中存储资源ID,等到需要显示标题的Compose界面中再解析成实际文本。
步骤1:修改密封类,存储资源ID
把title参数的类型从String改为Int,用来保存字符串资源的ID:
sealed class Destinations( val route: String, val titleResId: Int, // 改为资源ID类型 val icon: ImageVector ){ //Bottom bar windows object Translate: Destinations("translate", R.string.app, Icons.Default.Translate) object Words: Destinations("words", R.string.words_title, Icons.Default.Assignment) object Numbers: Destinations("numbers", R.string.numbers_title, Icons.Default.FormatListNumbered) }
步骤2:补充字符串资源
在strings.xml中为Words和Numbers添加对应的标题资源:
<resources> <string name="app_name">AppEsquema</string> <string name="app"><b>"Translator"</b></string> <string name="words_title">Words</string> <string name="numbers_title">Numbers</string> </resources>
步骤3:在Compose界面中解析标题
在设置顶部栏的地方,通过stringResource方法将资源ID解析为实际字符串:
// 假设使用Navigation和Scaffold val navController = rememberNavController() val currentRoute = navController.currentBackStackEntry?.destination?.route Scaffold( topBar = { val title = when(currentRoute) { Destinations.Translate.route -> stringResource(Destinations.Translate.titleResId) Destinations.Words.route -> stringResource(Destinations.Words.titleResId) Destinations.Numbers.route -> stringResource(Destinations.Numbers.titleResId) else -> stringResource(R.string.app_name) } TopAppBar(title = { Text(title) }) }, bottomBar = { /* 底部导航栏实现 */ } ) { innerPadding -> NavHost(navController = navController, startDestination = Destinations.Translate.route) { // 导航页面配置 composable(Destinations.Translate.route) { /* Translate页面 */ } composable(Destinations.Words.route) { /* Words页面 */ } composable(Destinations.Numbers.route) { /* Numbers页面 */ } } }
关键说明
- 路由(
route)不需要绑定字符串资源,它只是导航用的唯一标识,用固定字符串即可,不需要本地化。 - 字符串资源的解析必须在拥有Compose上下文的环境中进行(比如
@Composable函数内),这里stringResource会自动获取当前上下文来加载资源。
内容的提问来源于stack exchange,提问作者Josue Velasquez
相关产品推荐
相关产品推荐

