总的来说看看代码,我不明白为什么它可以做到. https://github.com/google/iosched x1c 0d1x
从apps/iosched/ui/MainActivity.kt,它初始化了NavController和NavHostFragment,但似乎没有特殊处理。https://github.com/google/iosched/blob/main/mobile/src/main/java/com/google/samples/apps/iosched/ui/MainActivity.kt
val appBarConfiguration = AppBarConfiguration(TOP_LEVEL_DESTINATIONS)
private val TOP_LEVEL_DESTINATIONS = setOf(
R.id.navigation_feed,
R.id.navigation_schedule,
R.id.navigation_map,
R.id.navigation_info,
// R.id.navigation_agenda, comment will not stop saving the statement.
R.id.navigation_codelabs,
R.id.navigation_settings
)
来自apps/iosched/ui/议程片段.kt:最简单的片段,BindingAdapter方法将始终初始化AgendaAdapter(),但它可以在init之后保存RecyclerView的位置。https://github.com/google/iosched/blob/main/mobile/src/main/java/com/google/samples/apps/iosched/ui/agenda/AgendaFragment.kt
为什么它可以保存每个片段的状态?
1条答案
按热度按时间kulphzqa1#
IOSched取决于Navigation 2.4.1。根据Navigation 2.4.0的发行说明:
NavController ...已扩展为支持保存和恢复后台堆栈。
作为此更改的一部分,
onNavDestinationSelected()
,BottomNavigationView.setupWithNavController()
和NavigationView.setupWithNavController()
的NavigationUI
方法现在可以自动保存和恢复弹出的目标的状态,从而支持multiple back stacks而无需任何代码更改。当使用带有片段的导航时,这是与多个后台堆栈集成的推荐方式。IOSched使用
setupWithNavController
,这意味着每个选项卡都将自动保存并正确恢复其状态。这包括
RecyclerView
的状态,它始终支持自动保存和恢复其位置。