AlertDialog - 当用户点击“确定”时,我该如何运行检查?

4

对于自定义AlertDialog,我能否覆盖正面按钮以不关闭对话框?相反,如果我的检查失败,我想要运行一些编辑检查并保持对话框打开。

protected Dialog onCreateDialog(int id) {
  Dialog alertDialog = null;
  builder = new AlertDialog.Builder(this);
  switch(id) {
    case LOGIN_USERID_BLANK:
      builder.setMessage((String)getString(R.string.username_not_blank));
      builder.setPositiveButton((String)getString(R.string.ok), new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int whichButton) {
      // Can I do something here so that the dialog does not close?
}
});

中断执行;

4个回答

6

在谷歌更改对话 API 之前,以下是一个解决方法:

LayoutInflater factory = LayoutInflater.from(this);
final View view = factory.inflate(R.layout.yoMamma, null);
final Dialog dlg = new AlertDialog.Builder(this)
    .setTitle(R.string.yoTitle)
    .setView(view)
    .setPositiveButton(R.string.dlgOK, new DialogInterface.OnClickListener() {
      @Override public void onClick(DialogInterface dialog, int which) {
        // This won't be called.
      }})
    .create();
dlg.show();
View button = ((AlertDialog)dlg).getButton(DialogInterface.BUTTON_POSITIVE);
button.setOnClickListener(new View.OnClickListener() {
  @Override public void onClick(View v) {
    // This WILL be called.
    // Remove the following if you don't want the dialog to dismiss
    dlg.dismiss();
  }});

您可以像这样简化第一个setPositiveButton()调用:".setPositiveButton(R.string.dlgOk, null)" - Mike

1

好的,这里只是一个实现方式的想法。

AlertDialog.BuildersetView(View v) 方法。因此,可以添加一个自定义的 LinearLayout (在构建对话框之前从资源中填充)带有按钮。然后,在按钮上设置通常的 android.view.View.OnClickListener(s)。在这种情况下,根本不使用 AlertDialog.Builder 的那些“内置/原生”按钮。


虽然这个建议可能可行,但我认为这不是AlertDialog的预期用途。此时,我不确定AlertDialog是否比通用自定义对话框提供任何优势,并且可能会让未来的代码维护者感到困惑。 - Jeff Axelrod
@glenviewjeff:我同意这是一种“hack”,并且代码中肯定需要一个好的注释。另外请注意,没有人提出更好的建议,而我的建议实际上可以实现所需的功能。另一个你可能忽略的点是,“内置”的对话框按钮在其监听器运行后会自动关闭对话框,因此它们不适合所请求的行为。你有没有实现过通用的自定义对话框?如果有,请分享代码(我从未这样做过,所以看到一个示例对我来说很有趣)。 - Vit Khudenko
我暂时推迟了数据验证,直到我可以使用自定义对话框来正确地完成它。希望他们在未来的Android API中修复内置对话框的这个缺陷。等我有时间修复它后,我会尝试发布一些内容。 - Jeff Axelrod

0
这是我是如何做到的。从技术上讲,它并没有真正保持对话框的打开状态,而是暂时关闭并重新打开它,但最终结果是相同的。
class MyAlertDialog implements OnDismissListener, OnCancelListener {
    final private EditText editText;
    final private AlertDialog alertDialog;
    final private EventManager eventManager;
    final private CategorySelector categorySelector;

    private Boolean canceled;

    MyAlertDialog(Context context) {
        editText = new EditText(context);
        alertDialog = buildAlertDialog(context);
        alertDialog.setOnDismissListener(this);
        alertDialog.setOnCancelListener(this);
        show();
    }

    private AlertDialog buildAlertDialog(Context context) {
        return new AlertDialog.Builder(context)
        .setTitle(context.getString(R.string.enter_name))
        .setMessage(context.getString(R.string.enter_name))
        .setView(editText)
        .setNeutralButton(context.getString(R.string.save_text), null)
        .setNegativeButton(context.getString(R.string.cancel_text), null).create();
    }

    public void show() {
        canceled = false;
        alertDialog.show();
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        if(!canceled) {
            final String name = editText.getText().toString();
            if(name.equals("")) {
                editText.setError("Please enter a non-empty name");
                show();
            } else {
                doWhateverYouWantHere(name);
            }
        }
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        canceled = true;
    }
}

0

我遇到了同样的问题,即使对话框中要收集的输入存在验证问题,我也无法阻止对话框被关闭。为了解决这个问题,我在对话框的自定义视图中添加了按钮,以便我有更好的控制。

如果您使用dialogBuilder的setNeutralButton、setPositiveButton或setNegativeButton,似乎没有干净的方法来阻止对话框被关闭。


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