记录一次工作中遇到的异常交互问题。
UI层级结构如下:
ScrollView嵌套ViewPager,而ViewPager中子页面放的是GridView。
ViewPager左右翻页时,导致ScrollView向上滚动的原因是:
1. ViewPager左右翻会触发ScrollView的onLayout方法
2. 而ViewPager.onLayout的方法中会检测是否有子View获取焦点,有的话,会自动滚动以便显示出子View。这就是导致问题的原因。代码是在ViewPager.onLayout中。如下:
super.onLayout(changed, l, t, r, b);
mIsLayoutDirty = false;
// Give a child focus if it needs it
if (mChildToScrollTo != null && isViewDescendantOf(mChildToScrollTo, this)) {
scrollToDescendant(mChildToScrollTo);
}
mChildToScrollTo = null;
3. 解决办法就是让子View不再默认获取焦点。
mGridView.setFocusable(false);
mGridView.setFocusableInTouchMode(false);