前言
在项目中,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();
}
}
}