现象:当一个scrollView 里面包含很多childView,并且整个界面超出屏幕的范围,而且每个childView都获取焦点,scrollView就会自动滑到底部或者中间部分。
可以使用以下几种方法解决:
方法1:
//有点绕,基本思路,就是让scrollView优先于childView获取到焦点, private void disableAutoScrollToBottom() { mScrollView.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); mScrollView.setFocusable(true); mScrollView.setFocusableInTouchMode(true); mScrollView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { v.requestFocusFromTouch(); return false; } }); } // 恢复默认状态,禁掉scrollview的focus,这样就允许childview自动滑动 private void enableChildAutoScrollToBottom() { mScrollView.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); mScrollView.setFocusable(false); mScrollView.setFocusableInTouchMode(false); mScrollView.setOnTouchListener(null); }
方法2:
//将可能自动滑动的childview的focus禁掉,防止它自动滑动 mContentTextBox.setFocusable(false); //恢复默认状态,允许childview的focus,使它可以自动滑动 mContentTextBox.setFocusableInTouchMode(true); mContentTextBox.setFocusable(true); //这里要注意,仅仅setFocusable为true是不够的,需要设setFocusableInTouchMode。
方法3
//重写ScrollView的方法 @Override protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {return 0; }
//或者
@Override
protected boolean onRequestFocusInDescendants(int direction, Rect previouslyFocusedRect) {
return true;
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于