禁用使用可滚动子项

时间:2018-01-20 19:35:45

标签: android bottom-sheet

是否可以禁用BottomSheetDialogFragment的拖动,其中包含可滚动的视图,例如ViewPagerNestedScrollView,这样就无法向上或向下拖动但仍然无法拖动通过触摸外面被解雇,孩子们可以被拖走吗?

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

是否有任何解决方案或至少指导我应该修改原始源代码?

1 个答案:

答案 0 :(得分:6)

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

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

<强>爪哇:

@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,但除非由于某种原因它们被更改,否则这应该是稳定的。