Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有PageTransformer的嵌套片段中带有ViewPager的dispatchDraw上的Nullpointerexception_Java_Android_Android Fragments_Android Viewpager - Fatal编程技术网

Java 带有PageTransformer的嵌套片段中带有ViewPager的dispatchDraw上的Nullpointerexception

Java 带有PageTransformer的嵌套片段中带有ViewPager的dispatchDraw上的Nullpointerexception,java,android,android-fragments,android-viewpager,Java,Android,Android Fragments,Android Viewpager,我正在开发的Android应用程序中有一个非常难以描述的bug。我有一个片段,它依次包含一个由FragmentStatePagerAdapter支持的ViewPager。寻呼机包含两个片段 每当我尝试添加PageTransformer(使用Android开发者网站:)时,一切都正常,直到我尝试从包含viewpager的片段中导航(backpress或regular)。我得到的错误如下。我真的找不到是什么引起的。底部寻呼机结构的代码片段 Process: edu.utcs.android, PID

我正在开发的Android应用程序中有一个非常难以描述的bug。我有一个片段,它依次包含一个由FragmentStatePagerAdapter支持的ViewPager。寻呼机包含两个片段

每当我尝试添加PageTransformer(使用Android开发者网站:)时,一切都正常,直到我尝试从包含viewpager的片段中导航(backpress或regular)。我得到的错误如下。我真的找不到是什么引起的。底部寻呼机结构的代码片段

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);
我尝试过重新排列一些线条,以防出现某种比赛情况,也尝试过反转动画(第三行的“假”布尔值),但没有成功

编辑

通过一些尝试和错误,以及来自user2152081的一些帮助,我采用了一种黑客解决方法,用我自己的方法重写ViewPager类,并将draw()中的超级调用包装在try/catch块中

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

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

我遇到了完全相同的问题。查看ViewGroup的源代码,它在android.support.v4.view.ViewPager的子代中运行,并在那里点击NPE。正如您所说的,删除页面转换器是有效的,删除页面转换器对我来说也是有效的。我现在正在查看它,但是页面转换器和PagerTabStrip之间似乎存在某种不兼容

具体来说,当要求ViewPager重新绘制自身时,在堆栈跟踪的顶部:

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)
对我来说,此时ViewPager只有一个子项—PagerTabStrip。在视图组中的dispatchDraw中,这是NPE弹出的位置:

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);
    }
}
在我的实现中没有重载,所以它只返回i。我无法理解为什么它的计算结果为null——它看起来确实应该返回PagerTabStrip,但它不是,并且它在尝试访问子[0]的成员时正在生成NPE

我没有解决方案给你,但希望这和你遇到的类似。如果你发现什么,请告诉我

编辑 不太清楚原因,但用它替换我的ViewPager似乎已经解决了崩溃问题:

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;
    }

}

非常感谢你!重写getChildDrawingOrder(…)为我解决了这个问题!事实上,这并没有完全解决问题。只有viewpager中的第二个(最后一个)页面是可点击的,即使我点击了首页,它也会像我在第二个页面一样注册点击。但是,在自定义viewpager类中执行此操作确实修复了所有问题。这是一个非常糟糕的问题,但它是有效的。我会用它更新我的帖子@Override public void draw(Canvas Canvas){try{super.draw(Canvas);}catch(NullPointerException e){Log.d(“ViewPager”,“Nullpointer skipped”);}}是的,这看起来肯定不是我们想要的方式,但是我找不到任何东西,除了你描述这个问题的帖子。似乎没有多少人遇到过。如果您遇到更好的解决方案,请让我知道,因为我正在使用此解决方案。非常感谢你们两位!我花了两天时间试图解决这个问题,但多亏了你,90%的问题都解决了。我有两个片段,每个片段有4个ViewPagers,逻辑和你一样,问题是第一个片段正确地呈现了4个ViewPagers,但第二个片段没有。它们存在,但我不知道为什么它们像“隐藏”。我可以“滚动”浏览页面,但看不到它们。知道为什么吗?覆盖getChildDrawingOrder对我有效,但我已经覆盖了draw,以防万一。。。谢谢谢谢@pandanomic它也解决了我的问题。如果你用getActivity.getFragmentManager()替换getChildFragmentManager(),你也会遇到同样的问题吗。如果我使用getChildFragmentManager(),我会遇到同样的问题,但是如果我使用Activity fragmentManager,它就会消失。不知道它是否有帮助,但它解决了我的问题。@JM.Pascal我确实尝试过,但如果我离开并返回到该片段,它尝试重新添加这些viewpager片段,会导致其他问题。嵌套的viewpager应该得到childfragment管理器,而不是正则表达式,如果您将带有viewpager的片段添加到需要使用childfragment管理器的backbackback中。但是,如果此片段未添加到backstack(并且retainInstance==false),则可以使用正则表达式。这也让我很惊讶^^^但我有两种有效的配置。@JM.Pascal啊,很好。尽管如此,当我试着这么做的时候,它还是崩溃了(我想当时我正在使用backbackback,尽管后来我确实改变了它,所以有可能我的记忆力不好)。很高兴你能让它工作,希望能帮助其他看到这一点的人。
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;
    }

}