Search code examples
androidfragmentbottom-sheet

How to Allow outside touch for BottomSheetDialog?


I am working on BottomSheetDialogFragment my requirement is to create Bottom menu, Where if I click outside fragment area it should not cancel the Dialog and should persist.

ISSUE: And Event outside the Fragment should propagate to the lower fragment view/fragment.

I have already tried below(doesn't work for BottomDialogFragment): Allow outside touch for DialogFragment

To stop the dialog cancel i tried Below(i call setCancelable(boolean) in onStart() of BottomDialogFragment):

@Override
    public void setCancelable(boolean cancelable) {
        super.setCancelable(cancelable);

        BottomSheetDialog dialog = (BottomSheetDialog) getDialog();
        dialog.setCanceledOnTouchOutside(cancelable);

        View bottomSheetView = dialog.getWindow().getDecorView().findViewById(R.id.design_bottom_sheet);
        BottomSheetBehavior.from(bottomSheetView).setHideable(cancelable);
    }

reference

EDIT: Found it the hard way there is no other go then using Coordinate layout.The best solution for BottomSheetDialog is here

  • This Solution solve's the issue but bring's in one more issue. i.e all the actionMode event's are not navigated while all other app event's are.
  • And this is my best solution to the problem

Solution

  • you should use android.support.design.widget.BottomSheetBehavior.

    but if you want to have a bottomSheet in other class I suggest you use a Fragment and in this fragment open your bottomSheet

    open your fragment in this way.

    And in your fragment, open your bottomSheet in the following code:

    in onInitViews

    var mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheetCoordinatorLayout)
    mBottomSheetBehavior!!.state = BottomSheetBehavior.STATE_HIDDEN
    
    mBottomSheetBehavior!!.setBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() {
         override fun onStateChanged(bottomSheet: View, newState: Int) {
              when (newState) {
                 BottomSheetBehavior.STATE_HIDDEN -> {
                      fragmentManager?.popBackStack()
                 }
                 //BottomSheetBehavior.STATE_COLLAPSED -> "Collapsed"
                 //BottomSheetBehavior.STATE_DRAGGING -> "Dragging..."
                 //BottomSheetBehavior.STATE_EXPANDED -> "Expanded"
                 //BottomSheetBehavior.STATE_SETTLING -> "Settling..."
               }
          }
    
          override fun onSlide(bottomSheet: View, slideOffset: Float) {
              //text_view_state!!.text = "Sliding..."
          }
    })
    

    And your layout should be like this:

    <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layoutDirection="ltr">
    
        <android.support.design.widget.CoordinatorLayout
            android:id="@+id/bottomSheetCoordinatorLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:behavior_hideable="true"
            app:behavior_peekHeight="55dp"
            app:layout_behavior="@string/bottom_sheet_behavior">
    
            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/top_radius_primary_color"
                android:paddingStart="@dimen/material_size_32"
                android:paddingEnd="@dimen/material_size_32">
    
            </RelativeLayout>
        </android.support.design.widget.CoordinatorLayout>
    </android.support.design.widget.CoordinatorLayout>
    

    I hope it helps you