禁用BottomSheet拖动功能

5
由于我的声望点数较低,我无法发表评论。因此,我扩展了这个问题:如何禁用BottomSheet上的用户拖动
Ray W提供的解决方案有效,但现在它通过在父视图(CoordinatorLayout)上滑动和拖动来扩展。 图片 在该图像中,如果我在“不需要的拖动区域”上拖动,BottomSheet会向上滑动。如何过滤或停止不需要的视图上的触摸事件?
4个回答

7

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

behaviour.isDraggable = false

0
将 onInterceptTouchEvent 函数的返回值从 Ray W solution 更改为以下内容:
@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();
        }
    }

关于您的ListView评论,有什么解决方法吗?我在BottomSheet中使用了RecyclerView,也遇到了同样的问题。如果我尝试将BottomSheet拖动到除RecyclerView以外的任何其他地方,BottomSheet会像预期的那样保持展开状态。只有在拖动RecyclerView时,BottomSheet才开始跟随拖动。 - Zac
我最终使用了这个:https://github.com/umano/AndroidSlidingUpPanel Bottomsheet中还有很多其他的问题,例如在BottomSheet中无法刷新ListView。因此,我放弃了并改用SlidingUpPanel。 - Fahim

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) behavior).setState(BottomSheetBehavior.STATE_EXPANDED);


请修改您的答案,解释这段代码的作用以及它如何回答问题,这样对提问者和其他遇到类似问题的用户都有帮助。在 Stack Overflow 上,我们不鼓励仅有代码而没有解释的答案,因为它们无法说明如何解决问题。 - FluffyKitten

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

在按下返回键时关闭 BottomSheet:

@Override
    public void onBackPressed() {
        if(mBottomSheetBehavior1.getState() != 4) {
            mBottomSheetBehavior1.setState(BottomSheetBehavior.STATE_COLLAPSED);
        }
        else {
            super.onBackPressed();
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接