Fragment中处理返回事件

1,927 阅读1分钟

1. 有时我们需要在Fragment中处理返回事件(onBackPressed())

如果你有封装BaseFragment,可以这样处理

public abstract class BaseFragment extends Fragment {

    ...
    
    /*
     * fragment中的返回键
     *
     * 默认返回false,交给Activity处理
     * 返回true:执行fragment中需要执行的逻辑
     * 返回false:执行activity中的 onBackPressed
     * */
    public boolean onBackPressed() {
        return false;
    }

}

在需要处理返回事件的Fragment去继承该BaseFragment并重写onBackPressed()方法

public class ExampleFragment extends BaseFragment {

  ...
    //isHandleBack为true拦截Activity的返回事件
    /*重写父类的onBackPressed*/
    public boolean onBackPressed() {

        if (isHandleBack) {
            //点击了返回键Fragment的处理逻辑
            return isHandleBack;
        }

        return isHandleBack;
    }
}

在使用此Fragment的Activity中重写onBackPressed()方法

@Override
    public void onBackPressed() {
        List<Fragment> fragments = getSupportFragmentManager().getFragments();

        for (Fragment fragment : fragments) {
            /*如果是自己封装的Fragment的子类  判断是否需要处理返回事件*/
            if (fragment instanceof BaseFragment) {
                if (((BaseFragment) fragment).onBackPressed()) {
                    /*在Fragment中处理返回事件*/
                    return;
                }
            }
        }
        super.onBackPressed();
    }

2. 有时遇到ParentFragment中添加ChildFragment并要求点击返回ParentFragment的需求

我们可以这样处理

1.Activity中重写onBackPressed()
@Override
    public void onBackPressed() {
        List<Fragment> fragments = getSupportFragmentManager().getFragments();

        for (Fragment fragment : fragments) {
            /*如果是自己封装的Fragment的子类  判断是否需要处理返回事件*/
            if (fragment instanceof BaseFragment) {
                if (((BaseFragment) fragment).onBackPressed()) {
                    /*在Fragment中处理返回事件*/
                    return;
                }
            } 
        }
        super.onBackPressed();
    }
2.ParentFragment
public class Example1Fragment extends BaseFragment {

  ...
    public void addFragment(Fragment fragment){
        getChildFragmentManager()
                .beginTransaction()
                .add(R.id.container, fragment)
                .addToBackStack(null)
                .commit();
    }
    
    @Override
    public boolean onBackPressed() {
        List<Fragment> fragments = getChildFragmentManager().getFragments();

        for (Fragment fragment : fragments) {
            /*如果是自己封装的Fragment的子类  判断是否需要处理返回事件*/
            if (fragment instanceof BaseFragment) {
                if (((BaseFragment) fragment).onBackPressed()) {
                /*在Fragment中处理返回事件*/
                return true;
                }
            }
        }
        return false;
    }

}

3.ChildFragment

public class Example1Fragment extends BaseFragment {

  ...
    
    /*重写父类的onBackPressed*/
    @Override
    public boolean onBackPressed() {
        if(getParentFragment() != null){
            getParentFragment().getChildFragmentManager().popBackStack();
            return true;
        }
        return false;
    }

}