Android 编译工具升级到24后遇到的坑之V4包的Fragment

来源:互联网 发布:摄氏度转华氏度 c语言 编辑:程序博客网 时间:2024/05/16 14:07

android.support.v4.app.Fragment版本升到24及更高后,修复了一些fragment的bug,例如显示隐藏问题,但是又改了一部分逻辑,显示隐藏问题请看这篇文章

http://blog.csdn.net/archer_zoro/article/details/54237363

http://www.jianshu.com/p/c12a98a36b2b


开发工具是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.


0 0
原创粉丝点击