Я хочу добавить строковый ресурс в свое приложение на верхней панели, но когда я его вызываю, появляется число, и поскольку это закрытый класс, он не позволяет мне реализовать 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)
}
Я не ввожу строку напрямую, потому что верхняя панель меняет имя при навигации по окнам, и я хочу, чтобы она была персонализирована.
это код для изменения заголовка окном, если он работает, но он получает имя пути к окну, и единственное решение, которое я видел, - это назначить строковый ресурс для пути, чтобы настроить его.
Вы можете получить возвращаемое значение из 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
}
}
})
}
}
...