前言
在項目中,F(xiàn)ragment 使用率非常高,因此我們不可避免的會遇到在 Fragment 中處理 Back 返回鍵的需求。目前市面上在 Fragment 中處理 Back 返回鍵的方法千奇百怪,特別當(dāng) Fragment 嵌入類似 WebView 這些組件以后,處理方法更是顯得奇怪。這里列舉一種個人目前自己項目中所采用的方法。
思路
- 由于只有 Activity 能響應(yīng)真正的 onBackPressed ,因此我們需要在 BaseActivity 中進行處理真正的 onBack 邏輯。
- 在 BaseFragment 中定義一個 onBackPressed 方法,這個方法交由 BaseActivity 調(diào)用,這個方法的目的是為了讓 BaseActivity 知道你的 Fragment 的回退邏輯是由 BaseActivity 來處理還是由你的 Fragment來處理。
代碼
- BaseActivity
public class BaseActivity extends AppCompatActivity {
@Override
public void onBackPressed() {
// 得到當(dāng)前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 {
/**
* 返回按鍵觸發(fā)時調(diào)用
*
* @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();
}
}
}