项目中遇到了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;
}
});
- 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);
}
测试可以满足要求