如何在自定义对话框的onCreate方法中取消或关闭对话框?

7

我创建了一个名为MyCustomDialog的自定义对话框,它是Dialog的扩展。我按照以下方式创建并显示自定义对话框:

new MyCustomDialog(myContext).show();

我重写了 Dialog.onCreate(Bundle savedInstanceState) 方法来进行初始化。我还在这个方法中检查是否满足某个条件,如果不满足,则想要关闭/取消我的对话框。我尝试在我的对话框的 onCreate(Bundle savedInstanceState)onStart() 方法中调用 cancel()dismiss() 方法,但没有效果。

有人知道如何在对话框显示之前取消或关闭对话框吗?


你在onCreate()方法中调用了super.onCreate()吗? - RaphMclee
你在写作哪个API级别的代码? - Andi Jay
2个回答

4
你应该将决定是否显示对话框的逻辑放在onCreate()方法之外,因为它不属于那里。
或者,将你的show()方法重命名为showIfRequired()(或其他名称),然后在那里添加条件显示逻辑。
我知道这并不是技术上回答你的问题,但你正在尝试做的事情不是正确的设计。这其实是一件好事,因为正确的方式更加简单。
另外,作为一个旁注,你应该使用DialogFragment来代替Dialog,它在v4支持库中可用。

是的,你可以在对话框子类中覆盖show()方法本身,并有条件地调用super.show()。 - CSmith
1
@CSmith 是的,但那将违反 DialogInterface.show() 方法的合约。 - Jeffrey Blattman

1

这是针对API级别10及以下的:

首先,您应该在Activity类中重写onCreateDialog(int id, Bundle args)方法,您是否正在这样做?对话框始终作为Activity的一部分创建和显示。其次,我认为您无法在onCreateDialog中取消/关闭对话框,因为当调用onCreateDialog时,它实际上还没有被创建。也就是说,您无法取消/关闭尚未创建的内容。您可以尝试覆盖onPrepareDialog()方法并在其中进行检查以取消/关闭对话框。此时,对话框应该已经被创建(只是没有显示),因此如果您在那里调用cancel/dismiss,则可以防止其被显示。

onPrepareDialog()是在显示对话框之前执行任何检查和决策的适当位置。这适用于Honeycomb之前的API。

这是针对API 11及更高版本的:

如果您使用较新的API,则应扩展DialogFragment。在这种情况下,我认为您可以在DialogFragment的onCreateView()方法中处理决策,该方法类似于onPrepareDialog()。

希望您已经阅读了以下内容:

http://developer.android.com/guide/topics/ui/dialogs.html

或者根据您的API阅读了以下内容:

http://developer.android.com/reference/android/app/DialogFragment.html

总的来说,也许更清洁的解决方案是禁用按钮或机制,以防止对话框首次出现?也就是说,编写代码时只有在真正需要调用Dialog.show()时才调用它。我需要了解更多关于您尝试做什么的详细信息。例如,假设您从按钮的onClick监听器中调用Dialog.show()。您不希望用户按下按钮,期望出现对话框,但由于某些原因而没有显示出来,这样用户就无法理解。更好的解决方案是完全禁用该按钮,以便用户明确知道由于应用程序中的其他原因而无法使用此功能。

onCreateDialog()DialogFragment中的一个方法。他没有使用DialogFragment,而是扩展了Dialog - Jeffrey Blattman
我所谈论的onCreateDialog实际上是Activity的一个方法。onPrepareDialog()也是如此。看起来OP没有使用DialogFragment。如果这个应用程序是在蜂窝前的版本,则OP应该这样做(Dialogfragment在Honeycomb之前不存在)。如果它是针对蜂窝和之后的版本,则OP应该使用DialogFragment。我已经将该评论添加到原始问题中。 - Andi Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接