I have implemented a BottomSheet Dialog and I want to prevent the bottomsheet from dismissing when the user touches outside of the bottomsheet when it's peeking (Not fully expanded state).
I have set dialog.setCanceledOnTouchOutside(false);
in the code but it doesn't seem to take any affect.
Here's my BottomSheetDialogFragment class:
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); } }
According to the BottomSheet specification bottom sheets can be dismissed by touching outside of the bottom sheet, therefore what are my options to override this behavior and prevent it being dismissed?
just include <layout /> and attach to BottomSheetBehavior , it will work fine.
setCancelable(false) will prevent the bottom sheet dismiss on back press also.
Using the Interface - onSlide which as a parameter slideOffSet of type float , can be used to dim the background. The new offset of this bottom sheet within [-1,1] range. Offset increases as this bottom sheet is moving upward.
You should use #setCancelable(false)
when you create an instance of it.
BottomSheetDialogFragment bottomSheetDialogFragment = new SequenceControlFragmentBottomSheet(); bottomSheetDialogFragment.setCancelable(false); bottomSheetDialogFragment.show(getChildFragmentManager(), bottomSheetDialogFragment.getTag());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With