让Fragment优雅的响应返回事件

前言

在项目中,Fragment 使用率非常高,因此我们不可避免的会遇到在 Fragment 中处理 Back 返回键的需求。目前市面上在 Fragment 中处理 Back 返回键的方法千奇百怪,特别当 Fragment 嵌入类似 WebView 这些组件以后,处理方法更是显得奇怪。这里列举一种个人目前自己项目中所采用的方法。


思路

  • 由于只有 Activity 能响应真正的 onBackPressed ,因此我们需要在 BaseActivity 中进行处理真正的 onBack 逻辑。
  • 在 BaseFragment 中定义一个 onBackPressed 方法,这个方法交由 BaseActivity 调用,这个方法的目的是为了让 BaseActivity 知道你的 Fragment 的回退逻辑是由 BaseActivity 来处理还是由你的 Fragment来处理。

代码

  • BaseActivity

public class BaseActivity extends AppCompatActivity {

    @Override
    public void onBackPressed() {
        // 得到当前Activity下的所有Fragment
        List fragments = getSupportFragmentManager().getFragments();
        // 判断是否为空
        if (fragments != null && fragments.size() > 0) {
            for (Fragment fragment : fragments) {
                // 判断是否为我们能够处理的Fragment类型
                if (fragment instanceof BaseFragment) {
                    // 判断是否拦截了返回按钮
                    if (((BaseFragment) fragment).onBackPressed()) {
                        // 如果有直接Return
                        return;
                    }
                }
            }
        }
        super.onBackPressed();
        finish();
    }
}

  • BaseFragment

public class BaseFragment extends Fragment {

    /**
     * 返回按键触发时调用
     *
     * @return 返回True代表我已处理返回逻辑,Activity不用自己finish。
     * 返回False代表我没有处理逻辑,Activity自己走自己的逻辑
     */
    public boolean onBackPressed() {
        return false;
    }

}

  • WebFragment
public class WebFragment extends BaseFragment {

    @Override
    public boolean onBackPressed() {
        if (mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        } else {
            return super.onBackPressed();
        }
    }
}

你可能感兴趣的:(让Fragment优雅的响应返回事件)