【发布时间】:2021-08-23 15:43:53
【问题描述】:
情况
我正在使用 Kotlin 和 Android Jetpack Compose 编写一个非常简单的应用程序
我有一个scaffold,其中包含我的navHost 和一个bottomBar。
我可以使用bottomBar 在三个主屏幕之间导航。
其中一个主屏幕有一个详细信息屏幕,不应显示bottomBar。
我的代码
到目前为止,这是小菜一碟:
// MainActivitys onCreate
setContent {
val navController = rememberAnimatedNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()
val currentRoute = navBackStackEntry?.destination?.route?.substringBeforeLast("/")
BottomBarNavTestTheme {
Scaffold(
bottomBar = {
if (currentRoute?.substringBeforeLast("/") == Screen.Detail.route) {
MyBottomNavigation(
navController,
currentRoute,
listOf(Screen.Dashboard, Screen.Map, Screen.Events) // main screens
)
}
}
) { innerPadding ->
NavHost( // to be replaced by AnimatedNavHost
navController = navController,
startDestination = Screen.Dashboard.route,
modifier = Modifier.padding(innerPadding)
) {
composable(Screen.Dashboard.route) { DashboardScreen() }
composable(Screen.Map.route) { MapScreen { navController.navigate(Screen.Detail.route) } }
composable(Screen.Events.route) { EventsScreen() }
composable(Screen.Detail.route) { MapDetailScreen() }
}
}
}
}
问题:
我想在我的屏幕之间进行转换,所以我使用Accompanists Navigation Animation:
只需将NavHost 替换为AnimatedNavHost。
从mainScreen 导航到detailScreen 时会出现奇怪的效果:
- bottomBar 隐藏
- 主屏幕调整大小:(见底部对齐文本)
- 详细信息屏幕的动画发生。
这看起来很糟糕,我该如何解决?
解决方案
最佳解决方案如下所示:
- 主屏幕保留底栏并淡出。
- 同时进入详情页没有底栏。
【问题讨论】:
-
您希望动画是什么样的?您的
if检查正在按照您说的做:一旦目的地发生变化(即当您navigate()),立即隐藏底部导航,没有任何动画。 -
我觉得不错
-
您是否尝试过使用
AnimatedNavHost而不是NavHost并看到区别? -
@hsm59 我正在使用 AnimatedNavHost。抱歉,如果不够清楚:“只需将 NavHost 替换为 AnimatedNavHost。”
-
这是 AndroidX 团队应该解决的一个有效问题。
标签: android android-jetpack-compose jetpack-compose-accompanist