Возможно ли, что вы можете получить фактическое значение строкового ресурса, вызвав его из запечатанного класса?

Я хочу добавить строковый ресурс в свое приложение на верхней панели, но когда я его вызываю, появляется число, и поскольку это закрытый класс, он не позволяет мне реализовать stringResource или getString.

<resources>
    <string name = "app_name">AppEsquema</string>
    <string name = "app"><b>"Translator</b>"</string>
</resources>
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)
}

Я не ввожу строку напрямую, потому что верхняя панель меняет имя при навигации по окнам, и я хочу, чтобы она была персонализирована.

это код для изменения заголовка окном, если он работает, но он получает имя пути к окну, и единственное решение, которое я видел, - это назначить строковый ресурс для пути, чтобы настроить его.

4
0
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)
    }
)

или вы можете добавить дополнительный параметр в свой закрытый класс 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, ...)
}

и в вашем вызове 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
                }
            }
        })
    }
}

...
    

Другие вопросы по теме