您是否可以通过从密封类调用字符串资源来获取字符串资源的实际值?

Jos*_*uez 5 resources android kotlin android-jetpack-compose jetpack-compose-navigation

我想在顶部栏中向我的应用程序添加一个字符串资源,但是当我调用它时会出现一个数字,并且因为它是一个密封类,所以它不允许我实现stringResourcegetString

<resources>
    <string name="app_name">AppEsquema</string>
    <string name="app"><b>"Translator</b>"</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
sealed class Destinations(
    val route: String,
    val title: String,
    val icon: ImageVector
){
    //Bottom bar windows
    object Translate: Destinations(R.string.app.toString(), "Translate", Icons.Default.Translate)
    object Words: Destinations("Words", "Words", Icons.Default.Assignment)
    object Numbers: Destinations("Numbers", "Numbers", Icons.Default.FormatListNumbered)
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我不直接输入字符串,因为顶部栏在浏览窗口时会更改名称,并且我希望它能够个性化。

这是通过窗口更改标题的代码,如果它有效,但它获取窗口路径的名称,我看到的唯一解决方案是将字符串资源分配给路径来自定义它。

在此输入图像描述

z.g*_*g.y 1

您可以捕获 backStackEntry 的返回值,并用它来检查您的目的地的路由参数,when并让它返回一个显式的String

var title by remember {
    mutableStateOf("")
}

LaunchedEffect(Unit){
     navController.currentBackStackEntryFlow.collect {
        title = it.destination.route.let { route ->
            when (route) {
                Destinations.Translate.route -> {
                     "Translate"
                }
                Destinations.Words.route -> {
                     "Words"
                }
                Destinations.Numbers.route -> {
                    "Numbers"
                } else -> {
                    "" // empty or your default title bar
                }
            }
        }
    }
}

TopAppBar(
    title = {
        Text(text = title)
    }
)
Run Code Online (Sandbox Code Playgroud)

Destination或者您可以向密封类添加附加参数

sealed class Destinations(
    @StringRes val stringRes: Int,
    val route: String,
    val title: String,
    val icon: ImageVector
) {
    object Translate: Destinations(R.string.translate_title, ...)
    object Words: Destinations(R.string.words_title, ...)
    object Numbers: Destinations(R.string.numbers_title, ...)
}
Run Code Online (Sandbox Code Playgroud)

并在您的 LaunchEffect 调用中

...

val context = LocalContext.current

LaunchedEffect(Unit){
    navController.currentBackStackEntryFlow.collect {
        title = context.getString(it.destination.route.let { route ->
            when (route) {
                Destinations.Translate.route -> {
                    Destinations.Translate.stringRes
                }
                Destinations.Words.route -> {
                    Destinations.Words.stringRes
                }
                Destinations.Numbers.route -> {
                    Destinations.Numbers.stringRes
                }
                else -> {
                    // empty or your default/initial title
                    Destinations.Translate.stringRes
                }
            }
        })
    }
}

...
    
Run Code Online (Sandbox Code Playgroud)