如何制作android对话框模态?

时间:2011-12-05 08:38:06

标签: android dialog modal-dialog

我实现了这样的自定义AlertDialog:

AlertDialog dialog = new AlertDialog.Builder(this)
    .setView(dialogView)
    .setTitle(getResources().getString(R.string.addedit_asklater_price))
    .setCancelable(false)
    .create();

    dialog.setMessage(text);
    dialog.setOwnerActivity(this);
    dialog.setButton(...)
    dialog.setButton(...)
    dialog.show();

    doProcessUserInput();

但是,我注意到dialog.show()控件立即流向doProcessUserInput()后没有等待用户使用任何对话框按钮关闭对话框。

这种行为似乎很奇怪,我期待对话框是模态的,就像我一直都知道的模态对话框一样。

我可以重构我的代码,以便从对话框按钮doProcessUserInput()调用onClickListener。然而,我想知道是否有办法在dialog.show()暂停程序执行,直到对话框完成。

PS:

  1. 我尝试使用扩展Dialog的自定义对话框,但它有 同样的问题。我正在按钮中创建对话框 onClickListener
  2. 我尝试实施Activity::onCreateDialog并使用showDialog(id)代替dialog.show(),但这也有同样的问题。

4 个答案:

答案 0 :(得分:4)

当然,您可以为对话设置onPositiveButton点击监听器,并从该监听器执行操作。

如果你确实想在某个时刻暂停你的活动,你可能会使用旧的java wait/notify机制或更方便的新机制,如执行者。

为什么你想这样做虽然不清楚。 Android对话框专门设计为非模态的,因此它们不会阻止您的应用程序(因为您的应用程序可以包含其他活动,例如本机电话呼叫活动,如果这些活动被阻止则会很糟糕。)

答案 1 :(得分:4)

这对我有用:创建一个Activity作为对话框。然后,

  1. 将此添加到活动的清单中:

    机器人:主题= “@机器人:风格/ Theme.Dialog”

  2. 将此添加到活动的onCreate

    setFinishOnTouchOutside(false);

  3. 在您的活动中覆盖onBackPressed:

    @覆盖 public void onBackPressed() {   //阻止“退回”离开此活动 }

  4. 第一个给对话框看的活动。后两者使其表现得像一个模态对话框。

答案 2 :(得分:2)

此外,您不应在对话框中阻止应用程序流。

Android开发指南和社区最佳做法指出,如果您需要某种模态,必须>在onClickListener中执行此操作。

答案 3 :(得分:1)

在调用show show()方法之前,请尝试调用 .setCancelable(false)。这对我很有用。