5

由于我的声誉点低,我无法发表评论。所以我扩展了这个问题: 禁用用户在BottomSheet上拖动

Ray W 提供的解决方案有效,但现在它通过在父视图(CoordinatorLayout)上滑动和拖动来扩展。

图片

在该图像中,如果我拖动“不需要的拖动区域”,BottomSheet 会向上滑动。如何过滤掉或停止不需要的视图上的触摸事件?

4

4 回答 4

7

对于 Kotlin,只需在代码中添加以下行,

behaviour.isDraggable = false
于 2020-11-02T10:33:30.720 回答
0

将Ray W 解决方案中的 onInterceptTouchEvent 函数返回值更改为:

@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, V child, MotionEvent event) {
  return super.onInterceptTouchEvent(parent, child, event) && mAllowUserDragging;
}

还有一件事,如果您在 BottomSheetLayout 中有一个 ListView,那么在 ListView 中滚动项目会将 bottomSheetBehavior 状态从“STATE_EXPANDED”更改为“STATE_DRAGGING”。示例代码片段:

@Override
    public void onBackPressed() {    
        if(isBottomViewOpen){ // set this bool in behavior callback
            behavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
        }else {
            super.onBackPressed();
        }
    }
于 2016-05-13T08:14:01.347 回答
0

简单的解决方案,它解决了我遇到的两个问题。

1-它阻止拖动事件。

2-它解决了listView滚动问题

CoordinatorLayout.Behavior<View> behavior;

View profile_config_layout_bottom_sheet = findViewById(R.id.list_view_audience_profile_config_layout);

CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) profile_config_layout_bottom_sheet.getLayoutParams();
behavior = layoutParams.getBehavior();
assert behavior != null;
((BottomSheetBehavior<View>) behavior).addBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
    @Override
    public void onStateChanged(@NonNull View bottomSheet, int newState) {
        if (newState == BottomSheetBehavior.STATE_DRAGGING) {
            ((BottomSheetBehavior<View>) behavior).setState(BottomSheetBehavior.STATE_EXPANDED);
        } 
    }
    @Override
    public void onSlide(@NonNull View bottomSheet, float slideOffset) {}
});

显示对话框:

((BottomSheetBehavior) 行为).setState(BottomSheetBehavior.STATE_EXPANDED);

于 2020-10-07T22:15:48.003 回答
-3

看这个 :

mBottomSheetBehavior1.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() {
            @Override
            public void onStateChanged(@NonNull View bottomSheet, int newState) {
                if (newState == BottomSheetBehavior.STATE_DRAGGING) {
                    mBottomSheetBehavior1.setState(BottomSheetBehavior.STATE_EXPANDED);
                }
            }

            @Override
            public void onSlide(@NonNull View bottomSheet, float slideOffset) {
                Log.i("BottomSheetCallback", "slideOffset: " + slideOffset);
            }
        });

onBackPress 时关闭 BottomSheet:

@Override
    public void onBackPressed() {
        if(mBottomSheetBehavior1.getState() != 4) {
            mBottomSheetBehavior1.setState(BottomSheetBehavior.STATE_COLLAPSED);
        }
        else {
            super.onBackPressed();
        }
    }
于 2017-01-31T07:48:33.257 回答