Android : Multi line text EditText inside BottomSheetDialog
Here is an easy way to do it.
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;
}
});
I solve this issues with following way:
I created custom work around bottom sheet behavior extends native 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); } }
then set touch event of
EditText
and when user touching area ofEditText
I will be disable handling event by parent with calling methodsetAllowUserDragging
: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; } });
For those who are interested in Kotlin solution. Here it is
editText.setOnTouchListener { v, event ->
v.parent.requestDisallowInterceptTouchEvent(true)
when (event.action and MotionEvent.ACTION_MASK) {
MotionEvent.ACTION_UP ->
v.parent.requestDisallowInterceptTouchEvent(false)
}
false
}