Android:BottomSheetDialog中的多行文本EditText

时间:2016-10-24 12:43:46

标签: android scroll android-edittext bottom-sheet

我有一个底部工作表对话框,并在布局中存在EditText。 EditText是多行的,最大行是3.我把:

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

但是当用户开始垂直滚动EditText的文本时,BottomSheetBehavior拦截事件和EditText将不会垂直滚动。

enter image description here

有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分:8)

这是一种简单的方法。

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

答案 1 :(得分:1)

我用以下方式解决了这个问题:

  1. 我创建了自定义工作的底部工作表行为扩展了原生的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. 然后设置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;
    }
    });
    

答案 2 :(得分:1)

适用于对 Kotlin 解决方案感兴趣的用户。在这里

editText.setOnTouchListener { v, event ->
                 v.parent.requestDisallowInterceptTouchEvent(true)
                 when (event.action and MotionEvent.ACTION_MASK) {
                     MotionEvent.ACTION_UP -> 
                      v.parent.requestDisallowInterceptTouchEvent(false)
                 }
                 false
             }