【发布时间】:2014-09-11 22:14:04
【问题描述】:
我正在开发的 Android 应用程序中有一个非常难以描述的错误。我有一个片段,它又包含一个由 FragmentStatePagerAdapter 支持的 ViewPager。寻呼机包含两个片段。
每当我尝试添加 PageTransformer(使用来自 Android 开发者网站的:http://developer.android.com/training/animation/screen-slide.html)时,一切正常,直到我尝试导航离开包含 viewpager(backpress 或常规)的片段。我得到的错误如下。我无法真正追踪是什么导致它 x_x。底部寻呼机构造的代码sn-p。
Process: edu.utcs.android, PID: 11728
java.lang.NullPointerException
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2946)
at android.view.View.draw(View.java:14476)
at android.support.v4.view.ViewPager.draw(ViewPager.java:2171)
at android.view.View.getDisplayList(View.java:13370)
at android.view.View.getDisplayList(View.java:13412)
at android.view.View.draw(View.java:14190)
at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
at android.view.View.draw(View.java:14476)
at android.widget.FrameLayout.draw(FrameLayout.java:472)
at android.view.View.getDisplayList(View.java:13370)
at android.view.View.getDisplayList(View.java:13412)
at android.view.View.draw(View.java:14190)
at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
at android.view.View.getDisplayList(View.java:13365)
at android.view.View.getDisplayList(View.java:13412)
at android.view.View.draw(View.java:14190)
at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2959)
at android.view.View.getDisplayList(View.java:13365)
at android.view.View.getDisplayList(View.java:13412)
at android.view.View.draw(View.java:14190)
at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
at android.support.v4.widget.DrawerLayout.drawChild(DrawerLayout.java:870)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
at android.view.View.getDisplayList(View.java:13365)
at android.view.View.getDisplayList(View.java:13412)
at android.view.View.draw(View.java:14190)
at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
at android.view.View.getDisplayList(View.java:13365)
at android.view.View.getDisplayList(View.java:13412)
at android.view.View.draw(View.java:14190)
at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
at android.view.View.draw(View.java:14476)
at com.android.internal.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:381)
at android.view.View.getDisplayList(View.java:13370)
at android.view.View.getDisplayList(View.java:13412)
at android.view.View.draw(View.java:14190)
at android.view.ViewGroup.drawChild(ViewGroup.java:3103)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
at android.view.View.draw(View.java:14476)
at android.widget.FrameLayout.draw(FrameLayout.java:472)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2324)
at android.view.View.getDisplayList(View.java:13370)
at android.view.View.getDisplayList(View.java:13412)
at android.view.HardwareRenderer$GlRenderer.buildDisplayList(HardwareRenderer.java:1577)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:1449)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2410)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2282)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1912)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1022)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5708)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
at android.view.Choreographer.doCallbacks(Choreographer.java:562)
at android.view.Choreographer.doFrame(Choreographer.java:532)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5083)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
at de.robv.andro
寻呼机构造:
mAdapter = new LabPagerAdapter(getChildFragmentManager());
mPager.setAdapter(mAdapter);
mPager.setPageTransformer(false, new ZoomOutPageTransformer());
mPager.setCurrentItem(mLabPosition);
我尝试重新排列一些行以防出现某种竞争情况,还尝试反转动画(第 3 行的“假”布尔值),但没有运气。
编辑
经过一些试验和错误,以及 user2152081 的帮助,我采用了一个 hacky 解决方法,用我自己的覆盖 ViewPager 类,并将 draw() 中的 super 调用包装在 try/catch 块中。
@Override
public void draw(Canvas canvas) {
try {
super.draw(canvas);
} catch (NullPointerException e) {
Log.d("ViewPager", "Nullpointer skipped");
}
}
【问题讨论】:
-
感谢@pandanomic 它也解决了我的问题。
-
如果您将 getChildFragmentManager() 替换为 getActivity.getFragmentManager(),您是否也会遇到同样的问题。如果我使用 getChildFragmentManager(),我遇到了同样的问题,但如果我使用 actvitiy fragmentManager,它就会消失。不知道它是否有帮助,但它解决了我的问题。
-
@JM.Pascal 我确实尝试过,但它会导致其他问题,因为如果我离开并返回该片段,它会尝试重新添加那些查看器片段。嵌套的 viewpager 应该得到 childfragment manager,而不是常规的
-
我发现如果您在后台添加带有 viewpager 的片段,您需要使用子片段管理器。但是,如果此片段未添加到 backstack(并且使用 retainInstance == false),则可以使用常规。它也让我感到惊讶 ^^ 但我的两种配置都有效。
-
@JM.Pascal 啊,好点。尽管如此,当我尝试这样做时,它仍然对我崩溃(我当时正在使用后台堆栈,尽管我后来确实更改了它,所以我的记忆可能已经关闭)。很高兴你让它工作了,希望能帮助其他看到这个的人。
标签: java android android-fragments android-viewpager