Android导航组件:如何保存片段状态

Nik*_*itc 9 navigation android android-architecture-navigation

我使用bottomNavigationView和导航组件。请告诉我在切换到另一个标签并返回到旧标签后如何不破坏片段?例如,我有三个选项卡-A,B,C。我的开始选项卡是A。导航到B之后,然后返回A。当我返回到选项卡A时,我不希望重新创建它。怎么做 谢谢

ian*_*ake 5

根据未解决的问题,导航不直接支持多个后向堆栈-即,由于片段不支持多个后向堆栈,因此当您从A或C返回到B时,保存堆栈B的状态。

根据此评论

NavigationAdvancedSample现在可从https://github.com/googlesamples/android-architecture-components/tree/master/NavigationAdvancedSample获取

本示例使用多个NavHostFragments(每个底部导航选项卡一个)来解决Fragment API在支持多个反向堆栈方面的当前限制。

我们将继续使用Fragment API,以支持多个后向堆栈,并在创建后将Navigation API插入其中,这将消除对NavigationExtensions.kt文件之类的东西的需求。我们将继续使用此问题来跟踪该工作。

因此,您可以立即在您的应用程序中使用NavigationAdvancedSample方法并为问题加注星标,以便在解决基本问题并将直接支持添加到Navigation时获得更新。

  • 我几乎放弃了导航架构组件。谷歌还应该提到他们的新 API 的局限性,这将使开发人员更容易决定哪个 API 更适合长期使用。 (12认同)
  • @Radu - 它不仅仅是三个片段,它是与每个选项卡关联的整个返回堆栈(以及每个*那些*片段的状态)。FragmentManager 仅将事物的状态直接存储在返回堆栈上(即,您可以点击系统后退按钮返回到它们),而底部导航则不是这种情况,您希望用户能够在选项卡之间交换而不丢失状态。 (9认同)
  • 因此,一个简单的功能(例如在内存中保留3个屏幕)需要一个新的“高级”样本吗?你一定是在开玩笑 (7认同)
  • 为什么所有示例现在都在 Kotlin 中?它非常不可读。 (2认同)

Die*_*kiy 5

如果您可以处理销毁片段,但想要保存 ViewModel,您可以将其范围限定到导航图中:

private val viewModel: FavouritesViewModel by 
    navGraphViewModels(R.id.mobile_navigation) {
        viewModelFactory
    }
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多

编辑

正如@SpiralDev 所指出的,使用 Hilt 简化了一点:

private val viewModel: MainViewModel by 
    navGraphViewModels(R.id.mobile_navigation) {
         defaultViewModelProviderFactory     
    }
Run Code Online (Sandbox Code Playgroud)

  • 对于 DaggerHilt:`private val viewModel:MainViewModel by navGraphViewModels(R.id.my_nav) { defaultViewModelProviderFactory }` (2认同)

小智 5

只需使用导航组件版本2.4.0-alpha01或更高版本