NullPointerException异常的dispatchDraw与ViewPager嵌套的片段,PageTransformer [英] Nullpointerexception on dispatchDraw with ViewPager in nested fragment with PageTransformer

查看:1138
本文介绍了NullPointerException异常的dispatchDraw与ViewPager嵌套的片段,PageTransformer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有在Android应用程序我工作的一个pretty的不伦不类的错误。我有一个片段,这反过来包含背靠一个FragmentStatePagerAdapter一个ViewPager。该寻呼机包含两个片段。

每当我尝试添加PageTransformer(通过从Android开发者网站上的:的 http://developer.android.com/training/animation/screen-slide.html ),一切工作正常,直到我试图从包含viewpager(背面preSS或常规片段导航离开) 。我得到的错误是如下。我真的不能跟踪什么导致它X_X。 code寻呼机建筑底部的片段。

 流程:edu.utcs.android,PID:11728
    显示java.lang.NullPointerException
            在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2946)
            在android.view.View.draw(View.java:14476)
            在android.support.v4.view.ViewPager.draw(ViewPager.java:2171)
            在android.view.View.getDisplayList(View.java:13370)
            在android.view.View.getDisplayList(View.java:13412)
            在android.view.View.draw(View.java:14190)
            在android.view.ViewGroup.drawChild(ViewGroup.java:3103)
            在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
            在android.view.View.draw(View.java:14476)
            在android.widget.FrameLayout.draw(FrameLayout.java:472)
            在android.view.View.getDisplayList(View.java:13370)
            在android.view.View.getDisplayList(View.java:13412)
            在android.view.View.draw(View.java:14190)
            在android.view.ViewGroup.drawChild(ViewGroup.java:3103)
            在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
            在android.view.View.getDisplayList(View.java:13365)
            在android.view.View.getDisplayList(View.java:13412)
            在android.view.View.draw(View.java:14190)
            在android.view.ViewGroup.drawChild(ViewGroup.java:3103)
            在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2959)
            在android.view.View.getDisplayList(View.java:13365)
            在android.view.View.getDisplayList(View.java:13412)
            在android.view.View.draw(View.java:14190)
            在android.view.ViewGroup.drawChild(ViewGroup.java:3103)
            在android.support.v4.widget.DrawerLayout.drawChild(DrawerLayout.java:870)
            在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
            在android.view.View.getDisplayList(View.java:13365)
            在android.view.View.getDisplayList(View.java:13412)
            在android.view.View.draw(View.java:14190)
            在android.view.ViewGroup.drawChild(ViewGroup.java:3103)
            在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
            在android.view.View.getDisplayList(View.java:13365)
            在android.view.View.getDisplayList(View.java:13412)
            在android.view.View.draw(View.java:14190)
            在android.view.ViewGroup.drawChild(ViewGroup.java:3103)
            在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
            在android.view.View.draw(View.java:14476)
            在com.android.internal.widget.ActionBarOverlayLayout.draw(ActionBarOverlayLayout.java:381)
            在android.view.View.getDisplayList(View.java:13370)
            在android.view.View.getDisplayList(View.java:13412)
            在android.view.View.draw(View.java:14190)
            在android.view.ViewGroup.drawChild(ViewGroup.java:3103)
            在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2940)
            在android.view.View.draw(View.java:14476)
            在android.widget.FrameLayout.draw(FrameLayout.java:472)
            在com.android.internal.policy.impl.PhoneWindow $ DecorView.draw(PhoneWindow.java:2324)
            在android.view.View.getDisplayList(View.java:13370)
            在android.view.View.getDisplayList(View.java:13412)
            在android.view.HardwareRenderer $ GlRenderer.buildDisplayList(HardwareRenderer.java:1577)
            在android.view.HardwareRenderer $ GlRenderer.draw(HardwareRenderer.java:1449)
            在android.view.ViewRootImpl.draw(ViewRootImpl.java:2410)
            在android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2282)
            在android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1912)
            在android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1022)
            在android.view.ViewRootImpl $ TraversalRunnable.run(ViewRootImpl.java:5708)
            在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:749)
            在android.view.Choreographer.doCallbacks(Choreographer.java:562)
            在android.view.Choreographer.doFrame(Choreographer.java:532)
            在android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:735)
            在android.os.Handler.handleCallback(Handler.java:733)
            在android.os.Handler.dispatchMessage(Handler.java:95)
            在android.os.Looper.loop(Looper.java:137)
            在android.app.ActivityThread.main(ActivityThread.java:5083)
            在java.lang.reflect.Method.invokeNative(本机方法)
            在java.lang.reflect.Method.invoke(Method.java:515)
            在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:777)
            在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
            在de.robv.andro
 

寻呼机建设:

  mAdapter =新LabPagerAdapter(getChildFragmentManager());
        mPager.setAdapter(mAdapter);
        mPager.setPageTransformer(假,新ZoomOutPageTransformer());
        mPager.setCurrentItem(mLabPosition);
 

我试图重新安排一些线情况下,它是某种形式的竞争条件,而且还试图扭转动画(下称假布尔3号线),但没有运气。

修改

通过一些试验和错误,并从user2152081,我已经走了一个哈克的解决方法与我自己重写ViewPager类,包装在抽奖超级调用()在try / catch块。

  @覆盖
公共无效画(油画画布){
    尝试 {
        super.draw(画布);
    }赶上(NullPointerException异常E){
        Log.d(ViewPager,空指针跳过);
    }
}
 

解决方案

我没有足够的代表处发表评论,所以我会回答在这里。

我遇到了一模一样的问题。纵观源的ViewGroup,它是通过对 android.support.v4.view.ViewPager 的孩子跑,打了NPE在那里。正如你所说,删除页面变压器的工作,就像卸下PagerTabStrip我。我看它的权利,但它看起来像某种页面变压器和PagerTabStrip之间的不兼容的。

具体而言,当ViewPager被要求重画自己,你的堆栈跟踪的顶部:

 在android.view.ViewGroup.dispatchDraw(ViewGroup.java:2946)
在android.view.View.draw(View.java:14476)
在android.support.v4.view.ViewPager.draw(ViewPager.java:2171)
 

对于我来说,在这一点上ViewPager只有一个孩子 - 的PagerTabStrip。在dispatchDraw在ViewGroup中,这是那里的NPE弹出:

 的for(int i = 0; I<计数;我++){
    最后查看孩子=儿[getChildDrawingOrder(计数,I)];
    如果((child.mViewFlags&安培; VISIBILITY_MASK)==可见|| child.getAnimation()!= NULL){
        更多| = drawChild(画布,儿童,drawingTime);
    }
}
 

到底在哪儿[]包含PagerTabStrip,因为它是第0项,由于某种原因,孩子[getChildDrawingOrder(算上我)被评估为null。

  getchildDrawingOrder(计数,I)
 

不超载在我的实现,所以它只是返回我。它超越我,为什么这是评估为null - 它肯定看起来像它应该返回PagerTabStrip,但它不是,它的生成试图访问的孩子当NPE [0]的成员

我对你没有办法解决,但希望这是类似于你碰上了。让我知道如果你发现任何东西。

修改

不明白为什么,但这种替换我ViewPager似乎已经解决的崩溃:

 包ca.test;

进口android.content.Context;
进口android.support.v4.view.ViewPager;
进口android.util.AttributeSet;

公共类TestViewPager扩展ViewPager {

    公共TestViewPager(上下文的背景下){
        超(上下文);
    }

    公共TestViewPager(上下文的背景下,ATTRS的AttributeSet){
        超(背景下,ATTRS);
    }

    @覆盖
    保护INT getChildDrawingOrder(INT childCount,int i)以{
        返回我;
    }

}
 

I'm having a pretty nondescript bug in the Android app I'm working on. I have a fragment, which in turns contains a ViewPager that's backed by a FragmentStatePagerAdapter. The pager contains two fragments.

Whenever I try to add a PageTransformer (using the ones from the Android developer site: http://developer.android.com/training/animation/screen-slide.html), everything works fine until I try to navigate away from the fragment containing the viewpager (backpress or regular). The error I get is the following. I can't really trace what's causing it x_x. Code snippet of the pager construction at the bottom.

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

Pager construction:

mAdapter = new LabPagerAdapter(getChildFragmentManager());
        mPager.setAdapter(mAdapter);
        mPager.setPageTransformer(false, new ZoomOutPageTransformer());
        mPager.setCurrentItem(mLabPosition);

I've tried rearranging some lines in case it was some sort of race condition, and also tried reversing the animation (the "false" boolean on the 3rd line), but no luck.

EDIT

With some trial and error, and some help from user2152081, I've gone with a hacky workaround by overriding the ViewPager class with my own, and wrapping the super call in draw() in a try/catch block.

@Override
public void draw(Canvas canvas) {
    try {
        super.draw(canvas);
    } catch (NullPointerException e) {
        Log.d("ViewPager", "Nullpointer skipped");
    }
}

解决方案

I don't have enough rep to comment, so I'll answer here.

I ran into exactly the same issue. Looking at the source for ViewGroup, it was running through the children of the android.support.v4.view.ViewPager and hitting the NPE there. As you stated, removing the page transformer worked, as did removing the PagerTabStrip for me. I'm looking at it right now, but it looks like some kind of incompatibility between the page transformer and the PagerTabStrip.

Specifically, when the ViewPager is asked to redraw itself, at the top of your stack trace:

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)

For me, at this point the ViewPager has only a single child - the PagerTabStrip. In dispatchDraw in ViewGroup, this is where the NPE pops up:

for (int i = 0; i < count; i++) {
    final View child = children[getChildDrawingOrder(count, i)];
    if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) {
        more |= drawChild(canvas, child, drawingTime);
    }
}

Where children[] contains the PagerTabStrip as it's 0th entry, for some reason, children[getChildDrawingOrder(count, i)] is evaluating to null.

getchildDrawingOrder(count, i) 

is not overloaded in my implementation, so it just returns i. Its beyond me as to why this is evaluating to null - it certainly seems like it should return the PagerTabStrip, but it's not and it's generating the NPE when trying to access the children[0]'s members.

I have no solution for you, but hopefully this is similar to what you've run into. Let me know if you find out anything.

EDIT

Not quite sure why, but replacing my ViewPager with this seems to have resolved the crash:

package ca.test;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;

public class TestViewPager extends ViewPager {

    public TestViewPager(Context context) {
        super(context);
    }

    public TestViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected int getChildDrawingOrder(int childCount, int i) {
        return i;
    }

}

这篇关于NullPointerException异常的dispatchDraw与ViewPager嵌套的片段,PageTransformer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆