问题背景

一个长页面内有ScrollView,也有EditText,EditText有焦点时,跳转到其他页面操完跳回当前页面,此时页面内容自动滚动到EditText所在的位置,用户体验非常不好。

问题分析

参考:https://www.jianshu.com/p/192f160f9e60

private void scrollToChild(View child) {
        child.getDrawingRect(mTempRect);
        /* Offset from child's local coordinates to ScrollView coordinates */
        offsetDescendantRectToMyCoords(child, mTempRect);
        int scrollDelta = computeScrollDeltaToGetChildRectOnScreen(mTempRect);
        if (scrollDelta != 0) {
            scrollBy(0, scrollDelta);
        }
    }

ScrollView的自滚动方法中基本都是通过调用computeScrollDeltaToGetChildRectOnScreen方法。
如果该方法返回值为0,则不滚动。

解决办法

自定义ScrollView,重写ScrollView的computeScrollDeltaToGetChildRectOnScreen方法,将返回值设为0。

public class NoScrollFocusScrollView extends ScrollView {
    public NoScrollFocusScrollView(Context context) {
        super(context);
    }
    public NoScrollFocusScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public NoScrollFocusScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    @Override
    protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {
        return 0;
    }
}