1、創(chuàng)建自定義接口類
public interface BackHandleInterface {
void onSelectedFragment(BackHandleFragment backHandleFragment);
}
2、創(chuàng)建一個(gè)自定義Fragment類
public abstract class BackHandleFragmentextends BaseFragment{
private BackHandleInterfacebackHandleInterface;
? ? /**
? ? * 所有繼承BackHandledFragment的子類都將在這個(gè)方法中實(shí)現(xiàn)物理Back鍵按下后的邏輯
? ? * FragmentActivity捕捉到物理返回鍵點(diǎn)擊事件后會(huì)首先詢問Fragment是否消費(fèi)該事件
? ? * 如果沒有Fragment消息時(shí)FragmentActivity自己才會(huì)消費(fèi)該事件
? ? */
? ? public abstract boolean onBackPressed();
? ? @Override
? ? public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
? ? ? ? if(getActivity()instanceof BackHandleInterface){
this.backHandleInterface = (BackHandleInterface)getActivity();
? ? ? ? }else{
throw new ClassCastException("Hosting Activity must implement BackHandledInterface");
? ? ? ? }
}
@Override
? ? public void onStart() {
super.onStart();
? ? ? ? backHandleInterface.onSelectedFragment(this);
? ? }
}
3、在fragment的容器Activity中
????????1)聲明變量屬性
? ? ? ? ?private BackHandleFragmentbackHandleFragment;
? ? ? ? 2)activity實(shí)現(xiàn)接口(implements BackHandleInterface),重寫回調(diào)方法
@Override
public void onSelectedFragment(BackHandleFragment backHandleFragment) {
this.backHandleFragment = backHandleFragment;
}
? ? ? ? 3)重寫onKeyDown()方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
//if判斷里面就調(diào)用了來自Fragment的onBackPressed()
? ? //一樣??!,如果onBackPressed是返回false,就會(huì)進(jìn)入條件內(nèi)進(jìn)行默認(rèn)的操作
? ? if(backHandleFragment ==null || !backHandleFragment.onBackPressed()){
if(getSupportFragmentManager().getBackStackEntryCount() ==0){
/**
? ? ? ? ? ? * 按返回鍵直接返回桌面,監(jiān)聽返回鍵,防止按了音量鍵也返回桌面
? ? ? ? ? ? */
? ? ? ? ? ? if (keyCode == KeyEvent.KEYCODE_BACK){
Intent intent =new Intent(Intent.ACTION_MAIN);
? ? ? ? ? ? ? ? intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
? ? ? ? ? ? ? ? intent.addCategory(Intent.CATEGORY_HOME);
? ? ? ? ? ? ? ? startActivity(intent);
return true;
? ? ? ? ? ? }
}
}
return super.onKeyDown(keyCode, event);
}
4、fragment繼承自定義fragemnt,重寫回調(diào)方法onBackPressed()
tip:因?yàn)槲业捻?xiàng)目中fragment是包含整個(gè)webview,需求是點(diǎn)擊返回后,webview如果可以返回上一個(gè)頁面就返回上一個(gè)頁面
@Override
public boolean onBackPressed() {
if (webView.canGoBack()){
webView.goBack();
return true;
? ? }else {
return false;
? ? }
}