切换到支持库的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中已修复

07-24 09:50
查看更多