Android : Multi line text EditText inside BottomSheetDialog

邮差的信 提交于 2019-11-30 17:20:36

问题


I have a bottom sheet dialog and exists EditText in layout. EditText is multiline, max lines is 3. I put :

commentET.setMovementMethod(new ScrollingMovementMethod());
commentET.setScroller(new Scroller(bottomSheetBlock.getContext()));
commentET.setVerticalScrollBarEnabled(true);

but when user will begin scrolling text of EditText vertically BottomSheetBehavior intercept event and EditText will not scroll vertically.

Anybody know how to solve this problem?


回答1:


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;
   }
});



回答2:


I solve this issues with following way:

  1. 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);
    }
    }
    
  2. then set touch event of EditText and when user touching area of EditText I will be disable handling event by parent with calling method 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;
    }
    });
    



回答3:


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
             }


来源:https://stackoverflow.com/questions/40218778/android-multi-line-text-edittext-inside-bottomsheetdialog

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!