ScrollView嵌套EditText的滑动冲突问题

项目中遇到了ScrollView嵌套EditText,输入框输入多行内容不能全部显示的时候,滑动EditText可以上下滑动查看EditText全部内容。
由于ScrollView也是可滑动的,EditText也是可滑动的,这就导致了滑动冲突

可以通过重写 EditText的onTouch 方法解决此问题。但是当EditText内容只有单行或者说已经全部显示的时候,通过此方法设置后,ScrollView也没有滑动。

也就是说,希望达到
1.如果EditText未完全显示,滑动的是EditText,可以浏览到其他文字
2.如果EditText已经完全显示,滑动EditText,是整个ScrollView进行滑动。

找到如下的解决方法:
链接:http://blog.csdn.net/z191726501/article/details/50701165
代码如下
1.设置EditText的setOnTouchListener 如下

//et是EditText控件
 et.setOnTouchListener(new View.OnTouchListener() {
   @Override
    public boolean onTouch(View v, MotionEvent event) {
        if ((v.getId() == R.id.et && canVerticalScroll(et))) {//canVerticalScroll的实现在第二步

// 禁用掉父控件的拦截器
                v.getParent().requestDisallowInterceptTouchEvent(true);

            if (event.getAction() == MotionEvent.ACTION_UP) {
                v.getParent().requestDisallowInterceptTouchEvent(false);
            }
        }
        return false;
       }
    });
  1. canVerticalScroll的实现如下:
    作用是判断EditText内容是否显示完全,即是否可滑动
    /**
     * EditText竖直方向是否可以滚动
     * @param editText  需要判断的EditText
     * @return  true:可以滚动   false:不可以滚动
     */
    private 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);
    }

测试可以满足要求

猜你喜欢

转载自blog.csdn.net/kangyouv/article/details/76339402