【问题标题】:AlertDialog - how can I run checks when user hits 'OK'AlertDialog - 当用户点击“确定”时如何运行检查
【发布时间】:2011-01-24 18:21:11
【问题描述】:

对于自定义 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?
}
});

休息;

【问题讨论】:

    标签: android android-alertdialog


    【解决方案1】:

    在 Google 更改 Dialog 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)”
    【解决方案2】:

    好的,这只是一个关于如何实现的想法。

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

    【讨论】:

    • 虽然这个建议可能有效,但我认为这不是 AlertDialog 的预期用途。那时,我不确定 AlertDialog 比通用自定义对话框有什么好处,并且可能会让未来的代码维护者感到困惑。
    • @glenviewjeff:我同意这是一种 hack,它肯定需要在代码中添加一个很好的注释。另请注意,当我的建议实际上符合要求时,没有其他人提出更好的建议。您可能缺少的另一点是“内置”对话框按钮在其侦听器运行后自动关闭对话框,因此它们不符合请求的行为。你有没有实现过一个通用的自定义对话框?如果是,请分享代码(我从来没有做过,所以看到一个示例对我来说很有趣)。
    • 我暂时推迟验证数据,直到我可以使用自定义对话框正确完成。我希望他们在未来的 Android API 的内置对话框中解决这个缺点。当我有时间解决这个问题时,我会尝试发布一些东西。
    【解决方案3】:

    这就是我的做法。从技术上讲,它不会让对话框保持打开状态,它会暂时将其关闭并重新打开,但最终结果是相同的。

    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;
        }
    }
    

    【讨论】:

      【解决方案4】:

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

      如果您使用 dialogBuilder's setNeutralButtonsetPositiveButtonsetNegativeButton,似乎没有一种干净的方法可以阻止对话框被关闭。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-19
        • 2011-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 2012-05-29
        相关资源
        最近更新 更多