不得不说的那些坑(一)

V4 26.0.0 FragmentManagerDelegate异常

V4-26.0.0 FragmentManagerDelegate异常

今天敲代码的时候。同事给我提了个BUG。我们的表情键盘一点就崩溃了。我当时有点发愣,用了半年的东西突然就崩溃了。以前都好好的。
然后我找日志


目录

代码块

日志内容:

  java.lang.IllegalStateException: Fragment 
  EmotionMainFragment{d12508c #1 id=0x7f0d037f EmotionMainFragment} declared target fragment AddShareCommentFragment{4815c41 #2 id=0x7f0d0196 AddShareCommentFragment} that does not belong to this FragmentManager!
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1266)
                                                                         at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1085)
                                                                         at 
....

百度了一下,根本没有这种错误过。那么自力更生,自己动手。
报错没有指向对应问题的内容,是在其他地方报的错。这是最烦的BUG之一了。
android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1266)
还有有个线索。FragmentManager 1266行。
下面是复制相关代码

FragmentManagerImpl.class

 void moveToState(Fragment f, int newState, int transit, int transitionStyle,
            boolean keepActive) {
            ....

                        // If we have a target fragment, push it along to at least CREATED
                        // so that this one can rely on it as an initialized dependency.
                        if (f.mTarget != null) {
                            if (!mActive.contains(f.mTarget)) {
                                throw new IllegalStateException("Fragment " + f
                                        + " declared target fragment " + f.mTarget
                                        + " that does not belong to this FragmentManager!");
                            }
                            if (f.mTarget.mState < Fragment.CREATED) {
                                moveToState(f.mTarget, Fragment.CREATED, 0, 0, true);
                            }
                        }
              ...

f.mTarget != null && !mActive.contains(f.mTarget)
这段代码分析的结果:
Fragment f设置了mTarget,即使设置了TargetFragment。但是不在mActive( ArrayList mActive)中,Google就能丢不这个错误。

IllegalStateException:Fragment f 和你的 mTarget 不是同一个FragmentManager。
那么我们的mTarget 和 Fragment f确实不是同一个。 mTargetFrament是依附于Activity的。
Fragment 是依附于mTargetFrament的。
然后什么情况下 要设置TargetFragment呢,需要Frament返回值的时候。
所以当 AActivity 需要 BFrament 返回值, BFrament又需要CFrament(B的子Frament)的时候不能用方法。

异常接口思路:

废了点时间,找到问题原因了。但是奇怪的是 我之前都是好的。怎么突然就坏了呢。我没有改过相关部分的代码啊。
总有原因了,这时候我旁边的安卓同事是没有问题的。当时想了想,是不是手机问题。
不对,我手机之前也是没有问题。那么,就是代码不一致了。
同一个代码,我次奥 就是Jar前几个周我更新了!
查看了源码。 草泥马,FragmentManagerImpl.class 26.0.0之前根本没有我上面的代码。
不知道google为什么在最新包加了这个报错,之后再研究!!!

总结

问题找到了,根源也找到了。那么两个解决思路。
1. jar包降低到26.0.0。
2. BFrament需要子Fragment回调的时候用其他方式传值,其他时候可以正常使用,这个情况遇到应该也是比较少的。需要两次回调。

诶,被Google坑了一把。擦!我最後使用了第二个解决方式。再坑还是跟着谷歌走吧。

注意:转发请注明转帖链接** http://blog.csdn.net/u011850446/article/details/71545539

猜你喜欢

转载自blog.csdn.net/u011850446/article/details/71545539