Fragment 内实现对返回键的监听处理

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 的添加顺序是至关重要的,当然也可以自行修改;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值