切换到支持库的25.2.0版本后,我注意到我的一些用户开始遇到此崩溃:
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.support.v4.e.a.get(java.lang.Object)' on a null object reference
at android.support.v4.app.FragmentTransition.getInEpicenterView(FragmentTransition.java:817)
at android.support.v4.app.FragmentTransition.access$000$97c744e(FragmentTransition.java:37)
at android.support.v4.app.FragmentTransition$4.run(FragmentTransition.java:657)
at android.support.v4.app.OneShotPreDrawListener.onPreDraw(OneShotPreDrawListener.java:64)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:944)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1982)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1073)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5903)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:828)
at android.view.Choreographer.doCallbacks(Choreographer.java:588)
at android.view.Choreographer.doFrame(Choreographer.java:558)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:814)
at android.os.Handler.handleCallback(Handler.java:739)
我在网上环顾四周,但没有发现任何有意义的内容。还有其他人能够重现此崩溃吗?有人知道任何解决方法吗?
更新资料
我找到了重现崩溃的方法。我的应用是使用单个活动和多个片段设置的。我有片段A和B都显示项目列表。每个列表中的项目都是相同的,只是排序不同并且使用了不同的布局。这两个片段都是“顶层片段”,我的意思是可以直接从导航抽屉中访问它们。
片段A是指定的“根片段”。这意味着,向后敲击将始终最终返回到片段A。这样,对片段A进行了编码,以便通过从片段回栈中弹出所有项目来尝试从导航抽屉导航到它。这对于重现崩溃似乎很重要。
点按片段A或B中的项目将打开片段C,并且该项目视图用作从片段A或B到片段C过渡效果的共享元素。我可以通过点按片段B中的项目来重现此崩溃,然后打开导航抽屉并选择片段A。
我现在正在调查导致此崩溃的原因以及如何解决此问题。
更新2
我已经查明了导致此崩溃的确切代码。给定片段A和B,以及从A-> B的共享元素过渡。再现步骤如下:
将A推到后堆栈。
从A导航到B(将播放共享元素过渡)。
通过
getSupportFragmentManager().popBackStack(null, 0);
将所有内容从后栈中弹出。观察崩溃。
我已向Google提交了一个错误,因为它似乎是支持库的错误。如果有人有任何解决方法,我仍然会接受答案。
最佳答案
也有这个问题。当用户在使用共享元素作为快速解决方案的屏幕上时,我只是暂时锁定了导航抽屉。但它似乎在支持库25.3.0中已修复