android - Android - 如何允许BottomSheetDialog外部触摸?


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


 }



我找不到其他的方法,只能使用坐标layout,最佳解决方案BottomSheetDialog,看这里

  • 这个方案可以解决问题,但是又带来了一个新问题,换句话说,所有actionMode事件都不被导航,而其他所有应用程序事件都被导航。

时间:

你应该使用 android.support.design.widget.BottomSheetBehavior

但是如果你想在其他类中使用bottomSheet,建议你使用Fragment在这个Fragment中打开你的bottomSheet

以这种方式打开你的fragment 。

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..."


 }


})



你的layout应该如下所示:


<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>



我希望它能帮助你

在你的BottomSheetDialog中尝试以下代码:


 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {


 return (super.onCreateDialog(savedInstanceState) as BottomSheetDialog).apply {


 setCanceledOnTouchOutside(false)


 }


 }



或者用<CoordinatorLayout>包装,例如,<ConstraintLayout>并实现<layout />并附加到BottomSheetBehavior

在使用BottomSheetDialogFragment之前,这是不可能的,BottomSheetDialogFragment是一个对话框和每个对话框的行为,它不允许用户在对话框的视图上进行拦截。

因此,为了实现这一点,你需要使用Fragment而不是BottomSheetDialogFragment,是的,它需要更改很多代码:) 如果你想要截获视图,你必须在没有BottomSheetDialogFragment的情况下。

...