Android 編譯工具升級到24後遇到的坑之V4包的Fragment

Android 編譯工具升級到24後遇到的坑之V4包的Fragment,android.support.v4.app.Fragment版本升到24及更高後,修復瞭一些fragment的bug。

開發工具是Android Studio我引入的依賴版本是compile'com.android.support:support-v4:25.3.1',舊工程就發生瞭這個錯誤。

java.lang.IllegalStateException: Fragment null must be a public static class to be properly recreated from instance state.

後來幾經查詢發現,是v4包升級後,FragmentManager 改變瞭判斷,

private void doAddOp(int containerViewId, Fragment fragment, String tag, int opcmd) {
    final Class fragmentClass = fragment.getClass();
    final int modifiers = fragmentClass.getModifiers();

     // 一開始是進行一些狀態的判斷
    if (fragmentClass.isAnonymousClass() || !Modifier.isPublic(modifiers)
            || (fragmentClass.isMemberClass() && !Modifier.isStatic(modifiers))) {
        throw new IllegalStateException("Fragment " + fragmentClass.getCanonicalName()
                + " must be a public static class to be  properly recreated from"
                + " instance state.");
    }
//後面省略
}

這裡拋出的異常就是我遇到的,解釋下判斷

java.lang.Class.isAnonymousClass()當且僅當底層類是匿名類,則返回true

java.lang.Class.isMemberClass() 返回true當且僅當底層類是成員類。

isPublic和isStatic是修飾,類是不是public和靜態類。

之前頁面是一個普通左右滑動頁面,用的viewpager和fragment組合,因為代碼比較少,兩個fragment都作為內部類寫在瞭裡面,一直相安無事,直到更新版本,解決辦法就是把內部類fragment提取出來作為一個普通類就沒問題瞭。

祝大傢好運,我搜這個問題一直沒搜到或者說沒什麼實際意義,最後還得研究代碼,希望我寫的能幫助到別人(ˇ?ˇ) 想~。

java.lang.IllegalStateException: Fragment null must be a public static class to be  properly recreated from instance state.

You May Also Like