Android项目开发填坑记-Fragmen的onBackPressed
知识背景
Fragment
在当前的Android开发中,有两种引用方式,一个是 Android 3.0 时加入的,一个是supportV4包中的。这里简称为Fragment3.0
和FragmentV4
。
Fragment中的返回
在Fragment中经常用到自定义标题栏,而返回按钮的点击事件一般设置为:getActivity().onBackPressed();
,这样可以使得点击返回按钮和点击手机上的返回键的效果一致,即调用所在Activity的onBackPressed();
。
那么可能会造成一个问题:
本来你是想点击返回按钮让当前的Fragment
出栈,显示上一个Fragment
,但是却关闭了整个Fragment
所在的Activity
。
即 启动Activity–>显示FragmentA–>显示FragmentB–>用户点击返回按钮或者手机上的返回键–>退出了Activity。
原因
下面我们追踪一下代码调用,找找产生这种现象的原因:
Fragment 3.0的getActivity().onBackPressed()
Activity类
1 | public void onBackPressed() { |
Fragment V4的getActivity().onBackPressed()
FragmentActivity
1 | public void onBackPressed() { |
真相
从对代码调用的追踪,发现了真相。Fragment3.0
和FragmentV4
Fragment3.0
的getActivity().onBackPressed()
默认调用了Activity
的onBackPressed()
方法,方法里面使用的getFragmentManager()
获取FragmentManager
对象弹出栈内的Fragment3.0
版的FragmentFragmentV4
的getActivity().onBackPressed()
默认调用了FragmentActivity
的onBackPressed()
方法,方法里面使用的getSupportFragmentManager()
获取FragmentManager
对象进行弹出栈内的FragmentV4
版的Fragment
简单说就是Fragment3.0
要放在继承了Activity
的Activity中使用:
1 | public class XXX_Activity extends Activity{ |
FragmentV4
要放在继承了FragmentActivity
的Activity中使用:
1 | public class XXX_Activity extends FragmentActivity{ |
Fragment和Activity版本不匹配时
开发的时候,或许并不能达到Fragment版本和对应的Activity相匹配的理想状态,那么就有了下面的一个比较完善的解决方案:
解决方案:
使用其匹配的Activity类的onBackPressed()
方法的代码重写所在的Activity
的onBackPressed()
方法:
FragmentV4
配合继承了Activity
的Activity中时:
XXX_Activity extends Activity
1 | //使用FragmentActivity的onBackPressed()的代码覆盖 |
Fragment3.0
配合继承了FragmentActivity
的Activity中时:
XXX_Activity extends FragmentActivity(或者AppCompatActivity)
1 | //使用Activity的onBackPressed()的代码覆盖 |
总结
由于当前 Android Studio 默认新建的 Activity 继承于 AppCompatActivity
,所以建议大家使用FragmentV4
进行开发,这样能省下不少麻烦,本系列还有一篇文章介绍Fragment3.0
使用onAttach
时的Bug,而这个对于FragmentV4
则没有。
传送门:Android项目开发填坑记-Fragmen的onAttach方法
PS: