Android: 如何在触摸外部时关闭 DatePicker DialogFragment?

Android: how to dismiss a DatePicker DialogFragment when touching outside?

我有一个扩展 DialogFragment 的工作 DatePickerFragment。我在 onCreateDialog() 中设置了一个 DatePickerDialog,然后尝试添加:

"picker.setCanceledOnTouchOutside(true);"

我正在 Android 8.0 Oreo 的设备上进行测试,触摸 DatePicker 对话框外部时没有任何反应。我使用 androidx.appcompat.app.AppCompatActivity 作为我的基础 Activity 和 androidx.fragment.app.DialogFragment 作为 DialogFragment;

代码:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    super.onCreateDialog(savedInstanceState);

    DatePickerDialog picker = new DatePickerDialog(getActivity(),this,year,month,day);
    **picker.setCanceledOnTouchOutside(true);**
    return picker;

这是创建片段的 Activity 代码:

DatePickerFragment newFragment = new DatePickerFragment();
// tried the below also, with no luck
**newFragment.setCancelable(true);**
newFragment.show(getSupportFragmentManager(), "datePicker");

我也在 DialogFragment 中尝试了以下内容,同样没有成功:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   ...
   getDialog().setCanceledOnTouchOutside(true);
   ... 
   }

和:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if (getDialog() != null) {
        getDialog().setCanceledOnTouchOutside(true);
    }
    return super.onCreateView(inflater, container, savedInstanceState);
}    

我参考了这个 post 可能的答案:How to dismiss a DialogFragment when pressing outside the dialog?。我在这里错过了什么?

您是否尝试将对话框设置为可取消

picker.setCancelable(true);

如果您想关闭扩展 DialogFragment 的对话框,请写

setCancelable(true);

在 onCreateView 内部。当您触摸外部时,对话框将关闭。

示例代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     setCancelable(true);
     return super.onCreateView(inflater, container, savedInstanceState);
}

我以为我有类似的问题,但在我的情况下,对话框周围似乎有一些阴影填充,我不得不在它的外部非常靠近屏幕边缘的地方单击以取消它。

这就是我创建对话框的方式:

val calendar = Calendar.getInstance()
val year = calendar.get(Calendar.YEAR)
val month = calendar.get(Calendar.MONTH)
val day = calendar.get(Calendar.DAY_OF_MONTH)

val dpd = context?.let {
    DatePickerDialog(it, DatePickerDialog.OnDateSetListener { _, pickedYear, pickedMonth, pickedDay ->

         //do something with picked date.

    }, year, month, day)
}

dpd?.setCanceledOnTouchOutside(true)
dpd?.show()

尝试在您的实现中设置 setCanceledOnTouchOutside(true) 并尝试在非常靠近屏幕边缘的地方点击关闭它,也许在 Pixel 3 XL 等大屏幕模拟器上测试它。现在我知道这不是解决方案,您需要处理所有类型的设备和屏幕尺寸,但我希望您确认您可能遇到与我相同的问题:该对话框 will在外部触摸时被取消,但这 "outside" 不是很明显,这可能是一个真正的问题。

只需在 Dialog onCreate 方法或构造函数中添加 setCancelable(true)

尝试使用 android 中的默认 DatePickerDialog,它在选择对话框外时默认关闭。

Try this 仍然是问题让我知道会发送相同的正确代码