Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent dismissal of BottomSheetDialogFragment on touch outside

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?

like image 963
RamithDR Avatar asked Feb 10 '17 08:02

RamithDR


People also ask

How do I allow outside touch for Bottomsheetdialog?

just include <layout /> and attach to BottomSheetBehavior , it will work fine.

How do I keep my bottom sheet from coming off Android?

setCancelable(false) will prevent the bottom sheet dismiss on back press also.

How can I dim the background when Bottomsheet is displayed without using dialog?

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.


1 Answers

You should use #setCancelable(false) when you create an instance of it.

    BottomSheetDialogFragment bottomSheetDialogFragment = new SequenceControlFragmentBottomSheet();     bottomSheetDialogFragment.setCancelable(false);     bottomSheetDialogFragment.show(getChildFragmentManager(), bottomSheetDialogFragment.getTag()); 
like image 63
M. Erfan Mowlaei Avatar answered Sep 24 '22 11:09

M. Erfan Mowlaei