Android : BottomSheetDialog 内的多行文本 EditText
Android : Multi line text EditText inside BottomSheetDialog
我有一个底部 sheet 对话框并且布局中存在 EditText。 EditText 是多行的,最大行数是 3。我输入:
commentET.setMovementMethod(new ScrollingMovementMethod());
commentET.setScroller(new Scroller(bottomSheetBlock.getContext()));
commentET.setVerticalScrollBarEnabled(true);
但是当用户开始垂直滚动 EditText 的文本时,BottomSheetBehavior 拦截事件并且 EditText 不会垂直滚动。
有人知道如何解决这个问题吗?
我通过以下方式解决了这个问题:
我围绕底部创建了自定义工作 sheet 行为扩展了原生 android BottomSheetBehavior
:
public class WABottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> {
private boolean mAllowUserDragging = true;
public WABottomSheetBehavior() {
super();
}
public WABottomSheetBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setAllowUserDragging(boolean allowUserDragging) {
mAllowUserDragging = allowUserDragging;
}
@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
if (!mAllowUserDragging) {
return false;
}
return super.onInterceptTouchEvent(parent, child, event);
}
}
然后设置 EditText
的触摸事件,当用户触摸 EditText
的区域时,我将禁用父级使用调用方法 setAllowUserDragging
处理事件:
commentET.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == R.id.commentET) {
botSheetBehavior.setAllowUserDragging(false);
return false;
}
return true;
}
});
这是一个简单的方法。
yourEditTextInsideBottomSheet.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
v.getParent().requestDisallowInterceptTouchEvent(true);
switch (event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});
对于那些对 Kotlin 解决方案感兴趣的人。在这里
editText.setOnTouchListener { v, event ->
v.parent.requestDisallowInterceptTouchEvent(true)
when (event.action and MotionEvent.ACTION_MASK) {
MotionEvent.ACTION_UP ->
v.parent.requestDisallowInterceptTouchEvent(false)
}
false
}
我有一个底部 sheet 对话框并且布局中存在 EditText。 EditText 是多行的,最大行数是 3。我输入:
commentET.setMovementMethod(new ScrollingMovementMethod());
commentET.setScroller(new Scroller(bottomSheetBlock.getContext()));
commentET.setVerticalScrollBarEnabled(true);
但是当用户开始垂直滚动 EditText 的文本时,BottomSheetBehavior 拦截事件并且 EditText 不会垂直滚动。
有人知道如何解决这个问题吗?
我通过以下方式解决了这个问题:
我围绕底部创建了自定义工作 sheet 行为扩展了原生 android
BottomSheetBehavior
:public class WABottomSheetBehavior<V extends View> extends BottomSheetBehavior<V> { private boolean mAllowUserDragging = true; public WABottomSheetBehavior() { super(); } public WABottomSheetBehavior(Context context, AttributeSet attrs) { super(context, attrs); } public void setAllowUserDragging(boolean allowUserDragging) { mAllowUserDragging = allowUserDragging; } @Override public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) { if (!mAllowUserDragging) { return false; } return super.onInterceptTouchEvent(parent, child, event); } }
然后设置
EditText
的触摸事件,当用户触摸EditText
的区域时,我将禁用父级使用调用方法setAllowUserDragging
处理事件:commentET.setOnTouchListener(new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (v.getId() == R.id.commentET) { botSheetBehavior.setAllowUserDragging(false); return false; } return true; } });
这是一个简单的方法。
yourEditTextInsideBottomSheet.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
v.getParent().requestDisallowInterceptTouchEvent(true);
switch (event.getAction() & MotionEvent.ACTION_MASK){
case MotionEvent.ACTION_UP:
v.getParent().requestDisallowInterceptTouchEvent(false);
break;
}
return false;
}
});
对于那些对 Kotlin 解决方案感兴趣的人。在这里
editText.setOnTouchListener { v, event ->
v.parent.requestDisallowInterceptTouchEvent(true)
when (event.action and MotionEvent.ACTION_MASK) {
MotionEvent.ACTION_UP ->
v.parent.requestDisallowInterceptTouchEvent(false)
}
false
}