有时候EditText显示内容过多,需要用到垂直滚动条,但是发现滚动的时候,如果有嵌套在ScrollView里面的话,滑动会存在冲突,在网上找了好多方法,有些并不管用,这里做个总结,方便后续查看:
如果显示了滚动条,滑动事件交给Edittext处理。如果内容太少,滑动事件由外层ScrollView持有。
1).xml中设置android:scrollbars="vertical"
2).czwt.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//触摸的是EditText并且当前EditText可以滚动则将事件交给EditText处理;否则将事件交由其父类处理
if ((v.getId() == R.id.czwt && canVerticalScroll(czwt))) {
v.getParent().requestDisallowInterceptTouchEvent(true);
if (event.getAction() == MotionEvent.ACTION_UP) {
v.getParent().requestDisallowInterceptTouchEvent(false);
}
}
return false;
}
});
3).czwt.setFocusable(false);
czwt.setFocusableInTouchMode(false);
czwt.clearFocus();
注意:不能使用enable属性,否则会导致 setOnTouchListener失效。
补充 如果要开启:则两个改成true,然后czwt.requestFocus()即可。
4./**
* 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);
}