android - 防止在外部触摸时解除 BottomSheetDialogFragment

标签 android bottom-sheet

我已经实现了一个 BottomSheet 对话框,并且我想防止当用户在查看时(未完全展开状态)触摸 Bottom Sheet 之外时关闭 Bottom Sheet 。

我在代码中设置了 dialog.setCanceledOnTouchOutside(false); 但似乎没有任何影响。

这是我的 BottomSheetDialogFragment 类:

public class ShoppingCartBottomSheetFragment extends BottomSheetDialogFragment  {

    private BottomSheetBehavior.BottomSheetCallback mBottomSheetBehaviorCallback = new BottomSheetBehavior.BottomSheetCallback() {

        @Override
        public void onStateChanged(@NonNull View bottomSheet, int newState) {
            if (newState == BottomSheetBehavior.STATE_HIDDEN) {
                dismiss();
            }

        }

        @Override
        public void onSlide(@NonNull View bottomSheet, float slideOffset) {
        }
    };

    @Override
    public void setupDialog(Dialog dialog, int style) {
        super.setupDialog(dialog, style);

        View contentView = View.inflate(getContext(), R.layout.fragment_shopping_cart_bottom_sheet, null);

        dialog.setCanceledOnTouchOutside(false);

        dialog.setContentView(contentView);

        CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) ((View) contentView.getParent()).getLayoutParams();
        CoordinatorLayout.Behavior behavior = params.getBehavior();

        if( behavior != null && behavior instanceof BottomSheetBehavior ) {
            ((BottomSheetBehavior) behavior).setBottomSheetCallback(mBottomSheetBehaviorCallback);
            ((BottomSheetBehavior) behavior).setPeekHeight(97);
            ((BottomSheetBehavior) behavior).setHideable(false);
        }
    }


    @Override
    public void onStart() {
        super.onStart();
        Window window = getDialog().getWindow();
        WindowManager.LayoutParams windowParams = window.getAttributes();
        windowParams.dimAmount = 0;
        windowParams.flags |= WindowManager.LayoutParams.FLAG_DIM_BEHIND;
        window.setAttributes(windowParams);
    }
}

根据 Bottom Sheet specification可以通过触摸 Bottom Sheet 的外部来解除 Bottom Sheet ,因此我有哪些选项可以覆盖此行为并防止它被取消?

最佳答案

您应该在创建它的实例时使用 #setCancelable(false)

    BottomSheetDialogFragment bottomSheetDialogFragment = new SequenceControlFragmentBottomSheet();
    bottomSheetDialogFragment.setCancelable(false);
    bottomSheetDialogFragment.show(getChildFragmentManager(), bottomSheetDialogFragment.getTag());

关于android - 防止在外部触摸时解除 BottomSheetDialogFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42154321/

相关文章:

android - 以编程方式获取安卓手机的电话号码

android - 带有单个@id 的TextView 会更改所有字体吗?

android - BottomSheetDialog 禁用拖动

flutter - 底板被键盘覆盖

java - 什么是DEX编译?

java - 并行列表与具有多个变量的类列表

java - 如何根据 xml 解析的值在 listview 中动态更改颜色?

android - BottomSheetDialogFragment 内的 LazyColumn 滚动问题

forms - 使用 SingleChildScrollView 时无法向下拖动 Bottom Sheet

android - 约束布局中 0dp 的对话框布局高度不起作用