【问题标题】:Android: how to dismiss a DatePicker DialogFragment when touching outside?Android:触摸外部时如何关闭 DatePicker DialogFragment?
【发布时间】:2020-05-06 13:53:44
【问题描述】:

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

"picker.setCanceledOnTouchOutside(true);"

我正在使用 Android 8.0 Oreo 的设备上进行测试,在 DatePicker 对话框之外触摸时没有任何反应。我使用 androidx.appcompat.app.AppCompatActivity 作为我的 BaseActivity 和 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;

这是创建 Fragment 的 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);
}    

我参考了这篇文章以获得可能的答案:How to dismiss a DialogFragment when pressing outside the dialog?。我在这里错过了什么?

【问题讨论】:

  • 您好,您可以发布源代码以显示日期选择器对话框吗?
  • 我做了,它在 onCreateDialog() 中创建,如上所示。你还有什么要找的吗?
  • 嗨@AJW,我的意思是你调用DialogFragment的语句。某事。喜欢myDatePickerFragment.show(getSupportFragmenetManager(), "tag")
  • 啊,好的,我现在添加,上面。
  • 添加一个在整个屏幕上展开的父布局。在父级上添加一个单击侦听器,当单击父级时关闭对话框

标签: android android-dialogfragment android-datepicker


【解决方案1】:

如果要关闭扩展 DialogFragment 的 Dialog,请编写

setCancelable(true);

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

示例代码:

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

【讨论】:

  • 见上文:“我还在 DialogFragment 中尝试了以下操作,但也没有成功:@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... getDialog().setCanceledOnTouchOutside (真); ... } "
  • 没有 getdalog()。它只有 1 行代码。我用示例使用编辑我的答案
  • 我在对话框中使用了 DatePicker。如何获取“R.layout.dialog_cari_barang”的 id,以便我知道要膨胀什么作为视图? DatePicker 没有带有 id 的 xml。
  • 对不起,我给你我自己的代码。现在我用你上面解释的代码编辑我的答案。
  • 回答赞成并接受并获得赏金。关键是使用 onCreateView() 和充气机。 “return super.onCreateView(inflater, container, savedInstanceState);”是什么意思?在你的代码答案中做什么?
【解决方案2】:

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

picker.setCancelable(true);

【讨论】:

  • 我没有,我会试试的。除了“setCanceledOnTouchOutside(true);”之外,我还需要设置吗?还是单独 setCancelable()?
  • 不走运。我自己尝试了 setCancelable() 并尝试了它并添加了“setCanceledOnTouchOutside(true);”但都没有用。
  • 尝试使用 dialogFragmnet.setCancelable(true);
  • 您的意思是在代码创建对话框片段的 Activity 中添加它吗?
  • 没有运气在 Activity 中添加“newFragment.setCancelable(true)”,在创建 DatePickerFragment 之后,在“newFragment.show...);”之前
【解决方案3】:

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

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

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 这样的大屏幕模拟器上测试它。现在我知道这不是一个解决方案,您需要处理所有类型的设备和屏幕尺寸,但我希望您确认您可能遇到与我相同的问题:该对话框 取消触摸外面,但这个“外面”并不那么明显,它可能是一个真正的问题。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 不是和@Fahad Alotaibi 一样的重复答案吗?
    【解决方案5】:

    Try to use the default DatePickerDialog from android which is default close when selecting out side the dialog.

    Try this 仍然存在问题,让我知道将发送相同的正确代码

    【讨论】:

      猜你喜欢
      • 2020-04-11
      • 1970-01-01
      • 2013-03-01
      • 2014-06-25
      • 1970-01-01
      • 2012-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多