1 简述
在 Activity 中,通过重写 onBackPressed() 方法,我们可以轻松的处理返回键的业务逻辑。然而引入 Fragment 之后, Fragment 并没有原生支持对返回键的监听,因此需要我们自行处理。因此,本文在这里列举了一种简单、通用的实现方式。
2 实现方式
(1) BaseFragment 基类中添加方法
public boolean onBackPressed();
如果返回 true ,表示本次返回键点击事件被该 Fragment 消耗,而不会调用 Activity 的 onBackPressed() 方法。
(2) BaseActivity 中重写 onBackPressed() 方法
@Override
public void onBackPressed() {
List<Fragment> list = getSupportFragmentManager().getFragments();
list = ListUtils.invertList(list);
Fragment topFragment = null;
// 从 Activity 中依次查找最近添加的 Fragment
if (!isEmpty(list)) {
for (Fragment fragment : list) {
if (null != fragment) {
// 递归查找最近添加的、处于屏幕最上层的 Fragment
topFragment = getTopFragment(fragment);
}
}
}
boolean isOverride = false;
if (topFragment instanceof BaseFragment) {
isOverride = ((BaseFragment) topFragment).onBackPressed();
} else {
isOverride = false;
}
if (!isOverride) {
super.onBackPressed();
}
}
private Fragment getTopFragment(Fragment curFragment) {
List<Fragment> source = curFragment.getChildFragmentManager().getFragments();
if (isEmpty(source)) {
return curFragment;
}
List<Fragment> list = ListUtils.invertList(source);
if (!ListUtils.isEmpty(list)) {
for (Fragment fragment : list) {
if (null != fragment) {
return getTopFragment(fragment);
}
}
}
return curFragment;
}
private boolean isEmpty(List list) {
return null == list || list.isEmpty();
}
3 注意事项
(1) BaseFragment 是所有 Fragment 的基类, BaseActivity 是所有 Activity 的基类;
(2) 每次点击返回键的时候都会递归查找 Activity 中 最后一次 Add 的 Fragment,所以 Fragment 的添加顺序是至关重要的,当然也可以自行修改;