讓Fragment優(yōu)雅的響應(yīng)返回事件

前言

在項目中,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();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容