导航架构组件-BottomNavigationView避免重新加载片段

时间:2020-01-15 20:36:22

标签: android android-fragments android-navigation android-architecture-navigation

我正在使用BottomNavigationView来显示导航图中的一堆片段。

在我的MainActivity中,底部导航设置如下:

val navController = findNavController(R.id.mainNavigationFragment)
setupActionBarWithNavController(navController)
bottomNavigationView.setupWithNavController(navController)

每个片段都有自己的FragmentScoped viewmodel,以提供其内容。

bottomnavview中的每个选项卡之间循环,我看到正在重新创建片段,这又导致为该片段创建新的viewmodel实例。 这将导致新的api调用再次获取数据。

如何避免重新获取此数据?

我知道我可以做到这些:

  1. 使用“活动”视图模型托管所有这些数据,但这仅会 制作一个单一的视图模型来托管我所有片段的数据。

  2. 缓存api响应,以便重新创建片段 从缓存中获取数据,而不是进行新的网络调用

是否有任何平台提供了最佳实践,我可以遵循该最佳实践来避免每次重新获取数据?

谢谢

2 个答案:

答案 0 :(得分:1)

我通过以下方法解决了此问题(经过数小时的研究,由于无法解释某些布局不一致,因此无法覆盖setOnNavigationItemSelectedListener

                                        | | | | |
                                        v v v v v 
bottomNavigationView.setOnNavigationItemReselectedListener(
    item -> Log.d(MY_TAG, "navigation item " + item.getTitle() + " reselected")
);

bottomNavigationView.setOnNavigationItemReselectedListener(item -> { } );

如果您不想使用Log条目:)

答案 1 :(得分:0)

最好设置一个ViewPager,底部为TabLayout(可以设置样式,使其看起来非常相似,只是它没有那些编号的标志),然后可以定义屏幕外阈值,即保持活动的页面数-在导航时,这是一种自欺欺人的方法,因为只需替换碎片即可,而无需任何条件。