Bug P2
Status Update
Comments
jg...@google.com <jg...@google.com> #2
I face with the same problem. I have different pageMargin in landscape and portrait and when viewpager is scrolled for the more than first position, after rotating device it is shifted.
I beleive the problem is inside onSizeChanged that is called after onConfigurationChanged, it has following code:
if (w != oldw) {
recomputeScrollPosition(w, oldw, mPageMargin, mPageMargin);
}
w always not equals oldw when changing orientation, so recomputeScrollPosition is called, but whit the same values for margin and oldMargin.
This should be fixed.
I beleive the problem is inside onSizeChanged that is called after onConfigurationChanged, it has following code:
if (w != oldw) {
recomputeScrollPosition(w, oldw, mPageMargin, mPageMargin);
}
w always not equals oldw when changing orientation, so recomputeScrollPosition is called, but whit the same values for margin and oldMargin.
This should be fixed.
jg...@google.com <jg...@google.com>
ga...@freeletics.com <ga...@freeletics.com> #3
[Comment deleted]
jg...@google.com <jg...@google.com> #4
I found the same problem in suport library v4, wrong align happens only when ViewPager has a page margin > 0.
wo...@gmail.com <wo...@gmail.com> #5
[Comment deleted]
jg...@google.com <jg...@google.com> #6
The issue is still reproducible in support library v4 (rev. 18).
I managed to fix the issue by importing the source code of ViewPager in my project and modifying from onSizeChanged method the following line:
From:
if (w != oldw) {
recomputeScrollPosition(w, oldw, mPageMargin, mPageMargin);
}
To:
if (w != oldw) {
recomputeScrollPosition(w, oldw, 0, 0);
}
I managed to fix the issue by importing the source code of ViewPager in my project and modifying from onSizeChanged method the following line:
From:
if (w != oldw) {
recomputeScrollPosition(w, oldw, mPageMargin, mPageMargin);
}
To:
if (w != oldw) {
recomputeScrollPosition(w, oldw, 0, 0);
}
Description
We're seeing this exception a lot:
Fatal Exception: java.lang.IllegalArgumentException: pointerIndex out of range
at android.view.MotionEvent.nativeGetAxisValue(MotionEvent.java)
at android.view.MotionEvent.getX + 2205(MotionEvent.java:2205)
at androidx.viewpager.widget.ViewPager.onTouchEvent + 2241(ViewPager.java:2241)
at android.view.View.dispatchTouchEvent + 12527(View.java:12527)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3026(ViewGroup.java:3026)
at android.view.ViewGroup.dispatchTouchEvent + 2705(ViewGroup.java:2705)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3032(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent + 2719(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3032(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent + 2719(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3032(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent + 2719(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3032(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent + 2719(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3032(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent + 2719(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3032(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent + 2719(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3032(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent + 2719(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3032(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent + 2719(ViewGroup.java:2719)
at android.view.ViewGroup.dispatchTransformedTouchEvent + 3032(ViewGroup.java:3032)
at android.view.ViewGroup.dispatchTouchEvent + 2719(ViewGroup.java:2719)
at com.android.internal.policy.DecorView.superDispatchTouchEvent + 444(DecorView.java:444)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent + 1835(PhoneWindow.java:1835)
at android.app.Activity.dispatchTouchEvent + 3465(Activity.java:3465)
at com.freeletics.activities.FreeleticsBaseActivity.dispatchTouchEvent + 291(FreeleticsBaseActivity.java:291)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent + 69(WindowCallbackWrapper.java:69)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent + 69(WindowCallbackWrapper.java:69)
at com.android.internal.policy.DecorView.dispatchTouchEvent + 402(DecorView.java:402)
at android.view.View.dispatchPointerEvent + 12768(View.java:12768)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent + 5230(ViewRootImpl.java:5230)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess + 5030(ViewRootImpl.java:5030)
at android.view.ViewRootImpl$InputStage.deliver + 4545(ViewRootImpl.java:4545)
at android.view.ViewRootImpl$InputStage.onDeliverToNext + 4598(ViewRootImpl.java:4598)
at android.view.ViewRootImpl$InputStage.forward + 4564(ViewRootImpl.java:4564)
at android.view.ViewRootImpl$AsyncInputStage.forward + 4704(ViewRootImpl.java:4704)
at android.view.ViewRootImpl$InputStage.apply + 4572(ViewRootImpl.java:4572)
at android.view.ViewRootImpl$AsyncInputStage.apply + 4761(ViewRootImpl.java:4761)
at android.view.ViewRootImpl$InputStage.deliver + 4545(ViewRootImpl.java:4545)
at android.view.ViewRootImpl$InputStage.onDeliverToNext + 4598(ViewRootImpl.java:4598)
at android.view.ViewRootImpl$InputStage.forward + 4564(ViewRootImpl.java:4564)
at android.view.ViewRootImpl$InputStage.apply + 4572(ViewRootImpl.java:4572)
at android.view.ViewRootImpl$InputStage.deliver + 4545(ViewRootImpl.java:4545)
at android.view.ViewRootImpl.deliverInputEvent + 7263(ViewRootImpl.java:7263)
at android.view.ViewRootImpl.doProcessInputEvents + 7232(ViewRootImpl.java:7232)
at android.view.ViewRootImpl.enqueueInputEvent + 7193(ViewRootImpl.java:7193)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent + 7369(ViewRootImpl.java:7369)
at android.view.InputEventReceiver.dispatchInputEvent + 247(InputEventReceiver.java:247)
at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(InputEventReceiver.java)
at android.view.InputEventReceiver.consumeBatchedInputEvents + 212(InputEventReceiver.java:212)
at android.view.ViewRootImpl.doConsumeBatchedInput + 7337(ViewRootImpl.java:7337)
at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run + 7392(ViewRootImpl.java:7392)
at android.view.Choreographer$CallbackRecord.run + 1092(Choreographer.java:1092)
at android.view.Choreographer.doCallbacks + 888(Choreographer.java:888)
at android.view.Choreographer.doFrame + 813(Choreographer.java:813)
at android.view.Choreographer$FrameDisplayEventReceiver.run + 1078(Choreographer.java:1078)
at android.os.Handler.handleCallback + 873(Handler.java:873)
at android.os.Handler.dispatchMessage + 99(Handler.java:99)
at android.os.Looper.loop + 201(Looper.java:201)
at android.app.ActivityThread.main + 6810(ActivityThread.java:6810)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 547(RuntimeInit.java:547)
at com.android.internal.os.ZygoteInit.main + 873(ZygoteInit.java:873)
Please note that the com.freeletics.activities.FreeleticsBaseActivity in the stacktrace does not modify the event. It just conditionally passes it to super (if the Activity is stopped it will just return true instead of calling super).
It happens at least on Android 5 to 9.