是否可以禁用BottomSheetDialogFragment
的拖动,其中包含可滚动的视图,例如ViewPager
或NestedScrollView
,这样就无法向上或向下拖动但仍然无法拖动通过触摸外面被解雇,孩子们可以被拖走吗?
我已经查看了所有答案here,但我并不高兴,因为大多数人都没有考虑可滚动的孩子或通过强制扩展状态来工作。最接近的是this answer,但仍允许拖动工作表。
是否有任何解决方案或至少指导我应该修改原始源代码?
答案 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,但除非由于某种原因它们被更改,否则这应该是稳定的。