HorizontalScrollView重新layout之后自动滑动初始位置问题解决
2017-07-03 16:40
686 查看
HorizontalScrollView在重新layout时,有时候会自动滑动到其他位置,这是由于他的后代view获取到焦点导致的,来让我们从代码层面看清这个问题:
而mChildToScrollTo这个view是在requestChildFocus中赋值的,
解决办法 :
覆写父类方法onLayout,就可以解决这个问题
@Override protected void onLayout(boolean changed, int l, int t, int r, int b) { int childWidth = 0; int childMargins = 0; if (getChildCount() > 0) { childWidth = getChildAt(0).getMeasuredWidth(); LayoutParams childParams = (LayoutParams) getChildAt(0).getLayoutParams(); childMargins = childParams.leftMargin + childParams.rightMargin; } final int available = r - l - getPaddingLeftWithForeground() - getPaddingRightWithForeground() - childMargins; final boolean forceLeftGravity = (childWidth > available); layoutChildren(l, t, r, b, forceLeftGravity); mIsLayoutDirty = false; // Give a child focus if it needs it //就是在这一行,scrollView自动滑动到那个有焦点的view的位置 if (mChildToScrollTo != null && isViewDescendantOf(mChildToScrollTo, this)) { scrollToChild(mChildToScrollTo); } mChildToScrollTo = null; if (!isLaidOut()) { final int scrollRange = Math.max(0, childWidth - (r - l - mPaddingLeft - mPaddingRight)); if (mSavedState != null) { mScrollX = isLayoutRtl() ? scrollRange - mSavedState.scrollOffsetFromStart : mSavedState.scrollOffsetFromStart; mSavedState = null; } else { if (isLayoutRtl()) { mScrollX = scrollRange - mScrollX; } // mScrollX default value is "0" for LTR } // Don't forget to clamp if (mScrollX > scrollRange) { mScrollX = scrollRange; } else if (mScrollX < 0) { mScrollX = 0; } } // Calling this with the present values causes it to re-claim them scrollTo(mScrollX, mScrollY); }
而mChildToScrollTo这个view是在requestChildFocus中赋值的,
@Override public void requestChildFocus(View child, View focused) { if (!mIsLayoutDirty) { scrollToChild(focused); } else { // The child may not be laid out yet, we can't compute the scroll yet mChildToScrollTo = focused; } super.requestChildFocus(child, focused); }
解决办法 :
覆写父类方法onLayout,就可以解决这个问题
@Override protected void onLayout(boolean changed, int l, int t, int r, int b) { final int tempScrollX = getScrollX(); super.onLayout(changed, l, t, r, b); final int scrollX = getScrollX(); if (tempScrollX != scrollX) { this.scrollTo(tempScrollX, 0); } }
相关文章推荐
- 解决HorizontalScrollView自动滑动问题
- HorizontalScrollView中嵌套ViewPager时,ViewPager无法滑动的问题解决方法
- 解决ViewPager横向的ViewGroup滑动冲突的问题,例如HorizontalListView,RecyclerView,各种layout等
- Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题
- Android 解决 HorizontalScrollView 里的内容滑动不全的问题
- CoordinatorLayout + AppBarLayout + NestScrollView 向上滑动卡顿问题解决方案
- 解决HorizontalScrollView与SeekBar滑动冲突的问题.
- Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题
- Android中Touch事件分析--解决HorizontalScrollView滑动和按钮事件触发问题
- Android 解决 ScrollView 嵌入 HorizontalScrollView 后滑动卡顿问题
- 一句代码解决CoordinatorLayout+AppBarLayout+NestedScrollView滑动不流畅的问题
- GridView+NestedScrollView 滑动冲突问题的两种解决方法
- scrollView嵌套listView,重新设置listview高度解决冲突,但打开activity之后,初始位置不是顶部解决方案
- 解决DrawerLayout以及viewpager点击或者滑动后卡顿的问题
- ViewPager中嵌套HorizontalScrollView导致无法滑动换页冲突解决
- 解决 HorizontalScrollView 和 ViewPager 的滑动冲突
- Android HorizontalScrollView 水平滑动 里面放listView 解决滑动冲突
- HorizontalScrollView 中嵌套 viewpager滑动冲突的解决
- Android:解决打开activity之后 屏幕初始位置不是顶部问题
- HorizontalScrollView嵌套在ListView,实现从右向左滑动单个删除,当滑动出来后,解决HorizontalScrollView被ListView回收+多个删除