Android: многострочный текст EditText внутри BottomSheetDialog
У меня есть диалог нижнего листа и существует EditText в макете. EditText многострочный, максимум строк 3. Я положил:
commentET.setMovementMethod(new ScrollingMovementMethod());
commentET.setScroller(new Scroller(bottomSheetBlock.getContext()));
commentET.setVerticalScrollBarEnabled(true);
но когда пользователь начнет прокручивать текст EditText по вертикали, событие перехвата BottomSheetBehavior и EditText не будут прокручиваться по вертикали.
Кто-нибудь знает, как решить эту проблему?
2 ответа
Решение
Вот простой способ сделать это.
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
}
Я решаю эту проблему следующим образом:
Я создал пользовательскую работу вокруг нижнего листа поведения расширяет родной 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; } });