最近在做一个小项目,项目主要是用到了安卓Jetpack中的Navigation来实现单Activity架构。网上虽然有很多介绍Navigation的文章,但是缺乏实际的开发说明介绍,本人在这次开发中因为第一次采用单Activity的方式开发,遇到了不少的坑,本片文章记录了利用Navigation来实现单Activity的一些问题,避免大家遇到同样的问题而耽误时间。
Navigation的使用这里就不展开介绍了,网上一抓一大把,入门的朋友们自行查阅。这里只记录在开发中遇到的问题。
问题一:嵌套Fragment,子页面还需要去嵌套Fragment来做页面,这个问题比较好解决,就是在子页面写fragment的时候不能在xml去定义fragment,这样会报错。只能在xml中像以前一样去写一个layout,然后动态的添加fragment。
问题二:系统返回键处理,也比较好解决,在Activity中定义一个局部变量fragment,然后在Base每次onResume的时候将该变量指向自己,像这样
然后在BaseFragment中定义一个方法,子类如需处理Back事件,重写此方法并返回true
最后在Activity中处理具体的事件
问题三:退出应用的Back事件处理;也比较好处理。首先我们来到我们第一层Fragment,也就是Activity最接近的Activity,我这里命名的是“MainFragment”,然后在这里重写我们上一步在BaseFragment中定义的拦截返回的方法,并返回true
代码就不给大家翻译了,一目了然,ok问题三解决。
问题四:跳转同一页面。有个需求是这样的,拿文章来举例,在文章详情页中,观看文章,啪啦啪啦全是图文混排的内容,然后底下有一个推荐文章列表,点击依然进入文章详情页。刚开始在navigation的编辑页用当前fragment指向自己去实现,发现根本不能完成跳转。解决步骤:
在navigation的xml中,添加具体fragment,右键Add Action选择Global
这样它左边会有一个箭头指向它:
切换到text
可以看到系统为我们生成了一个action,并指向刚刚添加的fragment。然后在你想跳转的地方使用这个action就可以了。
问题五:A跳转B,B再跳转C,在C做完操作,想直接回到A。默认一次一次按返回键是达不到的,我们需要这样调用:
Navigation.findNavController(view!!).popBackStack(R.id.mainFragment, true),
源码中的方法
public boolean popBackStack(@IdRes int destinationId, boolean inclusive)
这个回退方法接收两个参数,第一个:目的地id,注意是fragment在navigation中定义的id不是actionid,第二个参数是,是否将目的地弹出栈,在这个跳转流程中A->B->C,此时栈中有A、B、C,所以我们此时返回A需要将目标也出栈,并且在这个过程中会将途中的fragment都出栈。
问题六:开屏页,这是最难解决的,也是目前本人算是绕过去解决或者说从根本上不算解决的解决方法。因为在给navigation配置的时候,默认要设置一个根目标,就是启动后默认进入的第一个fragment,同时配置让navigation来为我们做栈管理defaultNavHost=“true”。这样在每次我们返回时默认最后会留在这个配置的startDestination。所以我们也无法让我们的SplashFragment来做startDestination,这样会把Splash页作为根了。本人也是尝试了很多方式,最后用了不算办法的办法...就是一切都是正常配置,只是在开启MainFragment以后第一时间跳转到Splash,做完操作后再回到Splash,当然返回也是要用问题五点方法popBackStack去返回。
本片文章记录了笔者尝试用Navigation实现单Activity架构中遇到的一些实际开发问题,文章开头也说了网上文章介绍Navigation的很多,不过大多是一些用法入门,实际开发中的一些实际问题确实很少能找到资料。如有不足希望大家留言探讨,尤其是对于文章中的问题六进行补充。不足之处请指正,勿喷轻喷,感谢大家。