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

如何在密封类中获取字符串资源值以实现顶部栏动态标题?

解决方案

问题出在你直接把资源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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:45:58