【问题标题】:Confirm before dismissing DialogFragment in Android在 Android 中关闭 DialogFragment 之前确认
【发布时间】:2021-09-10 19:33:25
【问题描述】:

我已经为我的 DialogFragment 定义了一个方法,它将弹出另一个(警报)对话框,我确认用户想要关闭 DialogFragment。如果是这样,那么我打电话给DialogFragment.dismiss()。如果不是,则应简单地忽略 DialogFragment 的关闭,并且用户应像以前一样返回到它。

此方法(例如,confirmCancel())用于 DialogFragment 底部的“取消”按钮。由于我还希望在用户按下后退按钮或触摸 DialogFragment 外部时显示它,因此我将 confirmCancel 设置为其onCancelListener(当然,我也使用了getDialog().setCanceledOnTouchOutside(true))。

这是confirmCancel()的代码:

public void confirmCancel()
{
    (new AlertDialog.Builder(getActivity())
             .setIcon(R.drawable.ic_baseline_warning_24)
             .setTitle("Discard changes")
             .setMessage("Are you sure you want to discard changes and go back?")
             .setPositiveButton("Yes", ( dialogInterface, i ) -> dismiss())
             .setNegativeButton("No", ( dialogInterface, i ) -> {})
             .show()).setCanceledOnTouchOutside(true);
}

这几乎可以完美地工作,除了当 AlertDialog 显示在屏幕上时,DialogFragment 已经关闭,并且在 AlertDialog 中采取的操作根本没有用。

所以我现在需要的是一种“取消”解除 DialogFragment 的方法,或者一种在解除之前调用 的方法。我该如何解决?

P.S.:getDialog().setCancelable(false) 对我没有帮助,因为我确实希望取消对话;只是我希望它有条件地取消。

【问题讨论】:

    标签: java android android-dialogfragment bottomsheetdialogfragment


    【解决方案1】:

    DialogFragmentDialog 都不提供在取消/关闭事件之前检查的条件,您可以设置该条件。 他们只提供在所述事件被触发后,当损害已经造成时收到通知的监听器。

    我已经梳理了源代码并确定他们无法强制它进入忽略第一个取消/关闭调用但仍然允许侦听器触发以便您可以捕获事件的状态,我考虑过反思混乱的领域,但它变得混乱。我还尝试强制异常,以创建无效状态,但没有无效状态可以允许您想要的功能。

    这是两个来源。

    https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/Dialog.java

    https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-activity-release/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java

    您可以使用包含ActivityWindow 来处理触摸事件并使用FragmentResultListener 将它们发送回DialogFragment,即DialogFragment 设置为不可取消并且当用户触摸外部 Activity 拿起它并调用setFragmentResult 将其发送回DialogFragment。这可能会或可能不会起作用,具体取决于对话框如何检测/接收外部触摸事件,当它不可取消时,它是消耗它们还是让它们失败。

    目前最简单的解决方案是复制上面的源代码,可能只是DialogFragment,然后自己制作来解决这个问题。

    或或或

    我完全错过了最明显的解决方案。

    【讨论】:

    • 谢谢。现在,我确实会坚持将 Dialog Fragment 设置为不可取消,并在用户触摸窗口外或按下后退按钮等情况下手动实现方法。但让我感到困惑的是,对于这个看似简单的问题,没有更简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2015-12-30
    • 2012-06-27
    相关资源
    最近更新 更多