1. 程式人生 > >Android專案開發填坑記-Fragment的onAttach

Android專案開發填坑記-Fragment的onAttach

背景

現在 Android 開發多使用一個 Activity 管理多個 Fragment 進行開發,不免需要兩者相互傳遞資料,一般是給 Fragment 添加回調介面,讓 Activity 繼承並實現。

回撥介面一般都寫在 Fragment 的onAttach()方法中,Fragment 3.0 的onAttach()方法有 2 個過載,其中一個被廢棄,所以通常是:

XX_Fragment extends Fragment(Fragment 3.0)

@Override
    public void onAttach(Context context) {
        if
(context instanceof OnCoverChangeListener) { mListener = (ABC_Listener) context; } else { throw new RuntimeException(context.toString() + " must implement ABC_Listener"); } super.onAttach(context); }

但是在一些特定的 Android 版本下,這個onAttach(Context context)

並未被呼叫,而是呼叫了廢棄的onAttach(Activity activity)方法。

解決方案

如果使用了 Fragment 3.0,並且用到了自定義回撥,那麼為了相容,需要:

@Override
    public void onAttach(Context context) {
        if (context instanceof OnCoverChangeListener) {
            mListener = (ABC_Listener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement ABC_Listener"
); } super.onAttach(context); } //SDK API<23時,onAttach(Context)不執行,需要使用onAttach(Activity)。Fragment自身的Bug,v4的沒有此問題 @Override public void onAttach(Activity activity) { super.onAttach(activity); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (activity instanceof OnCoverChangeListener) { mListener = (ABC_Listener) activity; } else { throw new RuntimeException(activity.toString() + " must implement ABC_Listener"); } } }

總結

建議使用FragmentV4版的,減少不必要的系統自身Bug的處理。

還有一篇關於FragmentV4、Fragment3.0的onBackPressed();的Bug詳解:
傳送門:Android專案開發填坑記-Fragmen的onBackPressed

PS:

你可以關注的我GithubCSDN微博