让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<android.support.v4.app.Fragment> 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();
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容