App改版,要大量使用Fragment,但是Fragment畢竟不是Activity,很多功能沒有Activity全面,比如Back事件監聽。
問題
有大量的Fragment,有的裏面是WebView,用戶點擊back希望能夠返回歷史記錄。想在特定的Fragment中攔截Back事件,會比較麻煩。
方案簡介
從網上找到了很多方案,但是覺得比較靠譜且用在了項目裏,效果很好。
下面介紹下,大致結構如下圖所示。
一:創建接口
public interface BackHandledInterface {
public abstract void setSelectedFragment(AbsFragment absFragment);
}
二:Activity 實現接口
public class AbsActivity extends FragmentActivity implements BackHandledInterface {
public AbsFragment absFragment;
@Override
public void setSelectedFragment(AbsFragment absFragment) {
this.absFragment = absFragment;
}
@Override
public void onBackPressed() {
if (absFragment.onBackPressed()) {
return;
}
super.onBackPressed();
}
}
三:Fragment
public abstract class AbsFragment extends Fragment {
protected BackHandledInterface mBackHandledInterface;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!(getActivity() instanceof BackHandledInterface)) {
throw new ClassCastException("Activity must implement BackHandledInterface");
} else {
this.mBackHandledInterface = (BackHandledInterface) getActivity();
}
}
@Override
public void onStart() {
super.onStart();
mBackHandledInterface.setSelectedFragment(this);
}
/**
* 所有繼承BackHandledFragment的子類都將在這個方法中實現物理Back鍵按下後的邏輯
* FragmentActivity捕捉到物理返回鍵點擊事件後會首先詢問Fragment是否消費該事件
* 如果沒有Fragment消息時FragmentActivity自己纔會消費該事件
*/
public abstract boolean onBackPressed();
}