-2

i just noticed if i use DepthPageTransformer() animation,app crashes while rotating screen portrait to landscape.

Crash reason is NullPointerException:(but it's not about my array list or object.already added a reason.And already added debugging results.if i dont use any transformer,app works very well.)

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.util.ArrayList.get(int)' on a null object reference

at android.support.v4.view.ViewPager.getChildDrawingOrder(ViewPager.java:800
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3704)
at android.view.View.draw(View.java:17472)
at android.support.v4.view.ViewPager.draw(ViewPager.java:2415)
at android.view.View.updateDisplayListIfDirty(View.java:16464)                                                     
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)                                                                               
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ViewGroup.recreateChildDisplayList(ViewGroup.java:3905)
at android.view.ViewGroup.dispatchGetDisplayList(ViewGroup.java:3885)
at android.view.View.updateDisplayListIfDirty(View.java:16424)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:341)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:366)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:3134)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2933)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2522)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
at android.view.Choreographer.doCallbacks(Choreographer.java:695)
at android.view.Choreographer.doFrame(Choreographer.java:631)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)                                                                             at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

and this is first error line

at android.support.v4.view.ViewPager.getChildDrawingOrder(ViewPager.java:800

@Override
protected int getChildDrawingOrder(int childCount, int i) {
    final int index = mDrawingOrder == DRAW_ORDER_REVERSE ? childCount - 1 - i : i;
    final int result =
            ((LayoutParams) mDrawingOrderedChildren.get(index).getLayoutParams()).childIndex;
    return result;
}

so it means mDrawingOrderedChildren is null.why it happens, i don't know...
and i noticed with debugging:
if i disable/comment setPageTransformer(true,new DepthPageTransformer()), app is working well.

private void setupViewPager(ViewPager viewPager) {

    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(adapter);
// if uncomment here,app crashes when rotating screen.
//  viewPager.setPageTransformer(true,new DepthPageTransformer()); 

}

and DepthPageTransformer.java

public class DepthPageTransformer implements ViewPager.PageTransformer {
    private static final float MIN_SCALE = 0.75f;
    @Override
    public void transformPage(View view, float position) {
        int pageWidth = view.getWidth();

        if (position < -1) { // [-Infinity,-1)
            // This page is way off-screen to the left.
            view.setAlpha(0);

        } else if (position <= 0) { // [-1,0]

            view.setAlpha(1);
            view.setTranslationX(0);
            view.setScaleX(1);
            view.setScaleY(1);
            view.bringToFront();


        } else if (position <= 1) { // (0,1]
            // Fade the page out.
            view.setAlpha(1 - position);

            // Counteract the default slide transition
            view.setTranslationX(pageWidth * -position);

            // Scale the page down (between MIN_SCALE and 1)
            float scaleFactor = MIN_SCALE
                    + (1 - MIN_SCALE) * (1 - Math.abs(position));
            view.setScaleX(scaleFactor);
            view.setScaleY(scaleFactor);

        } else { // (1,+Infinity]
            // This page is way off-screen to the right.
            view.setAlpha(0);
        }
    }

}

ViewPagerAdapter.java

public class ViewPagerAdapter extends FragmentPagerAdapter{

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position){
            case 0:
                return HomeFragment.newInstance("Home");
            case 1:
                return AFragment.newInstance("a");
            case 2:
                return BFragment.newInstance("b");
            case 3:
                return CFragment.newInstance("c");
            default:
                return HomeFragment.newInstance("home");
        }

    }
    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0: return "Home";
            case 1: return "A";
            case 2: return "B";
            case 3: return "C";
        }
        return null;
    }

    @Override
    public int getCount() {
        return 4;
    }
}

I think problem is in DepthPageTransformer but i still can't figure out it.Thank you in advice (and thank you downvoting and close request without reading the entire problem.)

erginduran
  • 1,497
  • 4
  • 23
  • 47
  • Possible duplicate of [What is a NullPointerException, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – Bharatesh Nov 30 '16 at 12:23
  • yes i found why it throws NPE error and wrote that reason "so it means mDrawingOrderedChildren is null.why it happens, i don't know... " but can't figure out it. why the mdrawingorderedchildren is null i do not know. Thank you for ur down voting and good answer! helped me a lot!! – erginduran Nov 30 '16 at 12:44

1 Answers1

0

just add this line in your manifest file

<activity
            -----
             -----
            android:configChanges="orientation|screenSize" >
</activity>

hopw this helps you

Kunal Dudka
  • 457
  • 1
  • 4
  • 14
  • your app crashes because whenever you change your rotation activity refreshes – Kunal Dudka Nov 30 '16 at 12:23
  • now i can't catch getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT in Fragment oncreateview? i show StaggeredGridLayoutManager if portrait its 2 columns if landscape 3 columns but now it does not detect it properly. – erginduran Nov 30 '16 at 12:39
  • i check orientation portrait or not and getting R.integer.column_size (normal,small,large,xlarge) different values. but now it does not detect it properly.if i don't use any pagetransformer like depth in my app,it works properly without add any stuff to manifest.why it happens,i really dont know. – erginduran Nov 30 '16 at 12:54