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