2、findNavController().popBackStack(R.id.AFragment,false)
这个方法用于执行返回指定页面的操作,例如本例: 进入的时候我们点击AFragment的按钮跳转到BFragment,在BFragment中执行如下代码:
val popBackStack = findNavController().popBackStack(R.id.AFragment,false)
println(“是否返回:$popBackStack”)
就可以指定返回AFragment。
popBackStack的第二个参数说明:
true:从B返回A的时候会把A出栈,然后重新打开A
false:从B返回A的时候A不会出栈,保留跳转到B之前的状态
popUpTo 和 popUpToInclusive
先看一下我们的导航图代码
<?xml version="1.0" encoding="utf-8"?>
这段导航图的代码实现如下效果: 从PopUpfragment跳转到PopUpAFragment再跳转到PopUpBFragment,正常情况下如果一直这么下去会无限跳转,产生无数个Fragment实例。
但是我们的代码中,在PopBFragment跳转PopUpfragment的activion中添加了popUpTo和popUpToInclusive。
其中popUpTo表示从PopBfragment回到PopUpfragment,过程中会把中间的Fragment也就是PopAFragment出栈,这样就不会同时存在多个Fragment实例了。而popUpToInclusive的作用就是在这个过程中将PopUpFragment也出栈然后重新创建。
插播一个报错
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mage.navigationdemo/com.mage.navigationdemo.PopUpToTestActivity}: java.lang.IllegalStateException: Activity com.mage.navigationdemo.PopUpToTestActivity@a289b29 does not have a NavController set on 2131230963
出现这个错误的场景复现:
应用首页MainActivity是一个导航图组件(NavHostFragment),我们再MainActivity的Fragment中使用startActivity方式跳转到PopUpToTestActivity,在PopUpToTestActivity的onCreate方法中调用如下代码
findNavController(R.id.nav_popuptotest).navigate(R.id.popUpFragment)
跳到导航图PopUpFragment,然后就报了上面的错误。
解决的方式如下面的代码:
val fragment:NavHostFragment = supportFragmentManager.findFragmentById(R.id.nav_popuptotest) as NavHostFragment
fragment.navController.navigate(R.id.popUpFragment)
即通过supportFragmentManager找到组件的NavHostFragment,利用NavHostFragment的NavController进行路由跳转
!!!讲一个 findNavController().popBackStack(R.id.AFragment,true)的坑
代码如下:
- 从A跳转到B
content.findViewById(R.id.btn_toBFragment).setOnClickListener {
findNavController().navigate(R.id.action_AFragment_to_BFragment)
}
- 从B使用popBackStack(R.id.AFragment,true)返回A
val popBackStack = findNavController().popBackStack(R.id.AFragment,true)
println(“是否返回:$popBackStack”)
- 再从A使用导航组件跳转到B
content.findViewById(R.id.btn_toBFragment).setOnClickListener {
findNavController().navigate(R.id.action_AFragment_to_BFragment)
}
第三部代码会报错:
java.lang.IllegalArgumentException: Navigation action/destination com.mage.navigationdemo:id/action_AFragment_to_BFragment cannot be found from the current destination NavGraph(com.mage.navigationdemo:id/navigation) startDestination={Destination(com.mage.navigationdemo:id/AFragment) label=fragment_a class=com.mage.navigationdemo.AFragment}
报错的原因就是找不到导航图,
原因分析:我们返回AFragment的时候AFragment被重新创建,不再是根视图了,也就是说新的AFragment是不与我们的navigation导航图文件进行关联的,所以自然无法使用导航组件跳转到BFragment的。
此种情况应该会有解决方案的,目前先不向这个方向探索
最后
小编这些年深知大多数初中级Android工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取
片转存中…(img-57hnCCT0-1719073640360)]一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
资料⬅专栏获取