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 仍然是问题让我知道会发送相同的正确代码
我有一个扩展 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 仍然是问题让我知道会发送相同的正确代码