Android Fragment 攔截 Back事件

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();

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章