ScrollView内嵌EditText滚动事件冲突处理

一、前言:

如果EditText内容过长,但控件高度有限的时候,在滑动内容的时候就会有滑动冲突了,处理方式是要先判断EditText内容是否过长,即可滚动时,设置父容器(即ScrollView)分发事件为关闭状态,否则为打开状态。附上相关代码:

判断EditText内容是否过长可滚动:

/**
 * EditText竖直方向是否可以滚动
 *
 * @param //editText需要判断的EditText
 * @return true:可以滚动   false:不可以滚动
 */
public static boolean canVerticalScroll(EditText editText) {
    // 滚动的距离
    int scrollY = editText.getScrollY();
    // 控件内容的总高度
    int scrollRange = editText.getLayout().getHeight();
    // 控件实际显示的高度
    int scrollExtent = editText.getHeight() - editText.getCompoundPaddingTop() - editText.getCompoundPaddingBottom();
    // 控件内容总高度与实际显示高度的差值
    int scrollDifference = scrollRange - scrollExtent;

    if(scrollDifference == 0) {
        return false;
    }

    return (scrollY > 0) || (scrollY < scrollDifference - 1);
}

假设你的EditText叫testEditText:

testEditText.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        //触摸的是EditText并且当前EditText可以滚动则将事件交给EditText处理;否则将事件交由其父类处理
        if ((v == testEditText && canVerticalScroll(testEditText))) {
            v.getParent().requestDisallowInterceptTouchEvent(true);
            if (event.getAction() == MotionEvent.ACTION_UP) {
                v.getParent().requestDisallowInterceptTouchEvent(false);
            }
        }
        return false;
    }
});

参考链接:https://blog.51cto.com/250215260/1926007
参考链接:https://blog.csdn.net/lzc__/article/details/83823269

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容