安卓库更新变化确实太快了。网上许多文章经验由于安卓库的更新,经常会变得不可用。如Fragment的切换方法,之前的使用经验是:
getActivity().supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_activity, XXXFragment(), null)
.addToBackStack(null)
.commit()
但是以上方法在安卓引入Navigation这种新的Fragment管理模式后就不管用了。虽然上述代码在Navigation模式下也能编译通过并执行,但执行效果就不是你想象的了。主要原因是上述代码中要切换的新Fragment是自己创建的,不是Navigation框架替你管理的,自然就产生冲突了。
在Android Studio 里新建项目时,选择“Bottom Navigation Activity”,自然就会为你引入Navigation框架。

在这种新的Fragment管理框架下,切换Fragment就简单很多了。
val navHostController = Navigation.findNavController(getActivity(), R.id.nav_host_fragment_activity_main) // 跳转到PlayFragment navHostController.navigate(R.id.navigation_play)
切换到之前一个fragment A
navHostController.navigateUp()
实践中,发现上述方法的好处是用户可以按后退键回到刚才切换走的Fragment A,但坏处是在底部导航菜单点击Fragment A就不会转到Fragment A。这种情况下,用户感受不好。为了确保底部导航菜单保持有效,就需要在切换前加一句话,将自身Fragment从回退栈中先弹出。如下面的代码
val navHostController = Navigation.findNavController(getActivity(), R.id.nav_host_fragment_activity_main) //将自身从回退栈中弹出 navHostController.popBackStack() // 跳转到PlayFragment navHostController.navigate(R.id.navigation_play)