本文来自我的简书博客:https://www.jianshu.com/p/fff1ef649fc0
Fragment可以说是在Android开发必需要使用到技术,项目中的界面基本上都是使用Fragment来实现,而Activity只是作为Fragment的载体,但有些特殊情况下Fragment也不得不处理Back键,如果是Activity的话还好说,直接覆盖 Activity的 即可,但Fragment可就没有这么幸运了,你可能和我一样,最开始有这样的需求的时候都会想去覆盖Fragment的方法,但是事与愿违,Fragment中并没有这样的方法,不仅如此,Fragment也没有更不可能有、这样的方法,那么Fragment如何处理back键成难题。
1、先定义一个 接口。
2、定义一个工具类,用于实现分发back事件,Fragment和Activity的外理逻辑是一样,所以两者都需要调用该类的方法。
3、当然 也要实现 接口(按需)
4、Activity覆盖方法(必须)
不是说好的两步么,这TM是4步啊!大哥不要生气,第一步和第二步我都给你做了,你只要在Gradle中加入以下的话以及第3、4步即可。你可以使用我提供的也可以让自己的实现FragmentBackHandler接口(只在需要Fragmen中实现就行),并在中用填入。
当你需要自己处理back事件时覆盖方法,如:
图示
Fragment的back键处理原理
图中红色部分为 或其它实现了 的Fragment。
back事件由下往上传递,当中间有未实现的Fragment作为其它Fragment的容器时,或该Fragment拦截了事件时,其子Fragment无法处理back事件。
有没有一种似曾相识的感觉?其实这和View的事件分发机制是一个道理。
原理
1、不管是也好,也好,其中内部包含的Fragment都是通过来管理的。
2、可以获取当前中处于活动状态的所有Fragment
3、事件由Activity交给当前Fragment处理,如果Fragment有子Fragment的情况同样可以处理。
这么做的好处
1、Activity不必实现接口,仅需在中调用即可,Fragment同理。
2、支持多个Fragment
3、支持Fragment嵌套
4、改动小,只修改有拦截back键需求的Fragment及其父Fragment,其它可以不动。
结语
本人不善言辞,也是第一次写博文,如有不对的地方请多指正,如果你有更好的办法请给我留言交流。
部分代码有删减,完整版请见Github:FragmentBackHandler
(https://github.com/ikidou/FragmentBackHandler)
想要获得更好的阅读体验?
想要获得文章内容更新?
链接无法点击?
领取专属 10元无门槛券
私享最新 技术干货