您的位置:首页 > 移动开发 > Android开发

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

2017-04-25 17:23 302 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: