您的位置:首页 > 移动开发 > Android开发

针对ScrollView和EditText合用时,EditText长度超过本身高度时不能滑动问题

2016-10-10 17:58 549 查看
由于ScrollView自身的滑动事件,将EditText的焦点抢占 ,所以需要对EditText的onTouch事件进行重写

mEdDetails.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
case R.id.ed_details:
v.getParent().requestDisallowInterceptTouchEvent(true);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
}
return false;
}
});


使用此方法确实解决了两者冲突事件,但是由于当触碰Edittext时,将滑动事件交给它,使得ScrollView的滑动事件失效,所以滑动时,有种卡顿的感觉

后来再网上查了资料 ,找到了此方法

/**
* 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的内容判断是否需要滚动,这样当Edittext内容不需要滑动时,滚动事件仍然交给ScrollView处理

完整代码如下:

mEdDetails.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (v.getId()) {
case R.id.ed_details:
// 解决scrollView中嵌套EditText导致不能上下滑动的问题
if (canVerticalScroll(mEdDetails))
v.getParent().requestDisallowInterceptTouchEvent(true);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
}
return false;
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息