如何允许BottomSheetDialog进行外部触摸? [英] How to Allow outside touch for BottomSheetDialog?

查看:178
本文介绍了如何允许BottomSheetDialog进行外部触摸?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用BottomSheetDialogFragment,我的要求是创建底部"菜单, 如果我在片段区域之外单击,它应该不取消对话框,并且应该保留.

问题: 片段外部"的事件应传播到较低的片段视图/片段.

我已经在下面尝试过(不适用于BottomDialogFragment): 允许DialogFragment进行外部触摸

要停止对话框,请尝试以下操作(我在BottomDialogFragment的onStart()中调用setCancelable(boolean)):

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

解决方案解决了这个问题,但将其整合到了一起更多问题.即所有的actionMode事件都不被导航,而其他所有应用程序事件都被导航.

  • 这是我对此问题的最佳解决方法解决方案
  • 解决方案

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

    但是如果您想在其他课程中使用bottomSheet,我建议您使用Fragment,并在此fragment中打开您的bottomSheet

    以这种方式打开您的片段 .

    然后在您的片段中,使用以下代码打开bottomSheet:

    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>
    

    希望对您有帮助

    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

    解决方案

    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

    这篇关于如何允许BottomSheetDialog进行外部触摸?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆