Scrollview自定义可滚动的EditText使Scrollview跳转

Customized Scrollable EditText in Scrollview Makes the Scrollview Jumps

我想在滚动视图中有一个 EditText,并且此 EditText 需要可滚动。所以我定制了一个如下:

public class myEditText extends EditText {

    public myEditText(Context context) {
        super(context);
    }

    public myEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public myEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        this.getParent().requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(ev);
    }
}

这个EditText只有一个问题,就是当文本变得很长的时候,包含它的Scrollview会因为某种原因跳转。这使我无法在一定长度后编辑文本。有人知道为什么会这样吗?

我想我解决了。

问题是当EditText中有光标时,bringPointIntoView(int offset)方法会让EditText滚动到光标所在的位置,这样光标就在你的视线范围内,你就可以编辑了文本。通常这就是它的工作原理,但是当 EditText 在 ScrollView 中时,它不会滚动 EditText,它也会使 ScrollView 滚动。这就是我看到 ScrollView 跳跃的原因。

解决方法是重写 bringPointIntoView 方法。

因此,如果有人想在 ScrollView 中使用可滚动的 EditText,我认为这可能会有所帮助:

public class myEditText extends EditText {

    public myEditText(Context context) {
        super(context);
    }

    public myEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public myEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        this.getParent().requestDisallowInterceptTouchEvent(true);
        return super.onTouchEvent(ev);
    }

    @Override
    public boolean bringPointIntoView(int offset) {
        return false;
    }
}