【问题标题】:Disable dragging of BottomSheetDialogFragment with scrollable children禁用带有可滚动子项的 BottomSheetDialogFragment 拖动
【发布时间】:2018-01-21 09:21:15
【问题描述】:

是否可以禁用 BottomSheetDialogFragment 的拖动,包含可滚动的视图,例如 ViewPagerNestedScrollView,这样它既不能向上也不能向下拖动,但仍然可以通过触摸外部和孩子们可以拖吗?

我查看了所有答案here,但我并不高兴,因为大多数人没有考虑到可滚动的孩子或通过强制展开状态来工作。最接近的是this answer,但仍然允许向上拖动工作表。

对于我应该对原始源代码进行哪些修改,是否有任何解决方案或至少指导?

【问题讨论】:

    标签: android bottom-sheet


    【解决方案1】:

    如果您调试应用程序并使用 Layout Inspector 工具,您将看到 BottomSheetDialogFragment 使用 CoordinatorLayout。暗色背景是一个简单的视图,带有关闭对话框的OnClickListener,工作表移动由CoordinatorLayout.Behavior 驱动。

    这可以通过修改创建的对话框来覆盖:​​

    Java:

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Dialog d = super.onCreateDialog(savedInstanceState);
        // view hierarchy is inflated after dialog is shown
        d.setOnShowListener(new DialogInterface.OnShowListener() {
            @Override
            public void onShow(DialogInterface dialogInterface) {
                //this disables outside touch
                d.getWindow().findViewById(R.id.touch_outside).setOnClickListener(null);
                //this prevents dragging behavior
                View content = d.getWindow().findViewById(R.id.design_bottom_sheet);
                ((CoordinatorLayout.LayoutParams) content.getLayoutParams()).setBehavior(null);
            }
        });
        return d;
    }
    

    科特林:

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        val d = super.onCreateDialog(savedInstanceState)
        //view hierarchy is inflated after dialog is shown
        d.setOnShowListener {
            //this disables outside touch
            d.window.findViewById<View>(R.id.touch_outside).setOnClickListener(null)
            //this prevents dragging behavior
            (d.window.findViewById<View>(R.id.design_bottom_sheet).layoutParams as CoordinatorLayout.LayoutParams).behavior = null
        }
        return d
    }
    

    这确实使用了设计库的内部 ID,但除非由于某种原因它们被更改,否则这应该是稳定的。

    【讨论】:

    • 我在编辑我的问题时出错。对不起。我仍然希望能够通过点击关闭。无论如何,您的建议不会也消除潜在孩子的拖累吗?
    • 不要覆盖 R.id.touch_outside OnClickListener 以保持点击关闭。我尝试使用嵌套滚动视图,它滚动正常,而底部工作表保持其初始高度。
    • 我刚刚测试了您的解决方案,但没有行为,底部工作表完全展开以覆盖所有屏幕。我尝试使用窥视高度,但没有奏效。你是如何控制初始高度的?
    • 您可以覆盖R.id.design_bottom_sheet 的更多布局参数以包括重力底部和 wrap_content 的 layout_height,但此时我开始怀疑您是否应该只创建一个具有底部重力和滑动的常规 DialogFragment输入/输出动画,因为您不使用工作表的核心功能,即嵌套滚动、拖动和捕捉。
    • 我的 layout_height 大约是 500dp。使用您的方法,底部有一个透明空间,即认为剩余高度,即 rootlayoutht - ht.ofbottomsheet。它看起来很可怕。怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    相关资源
    最近更新 更多