AlertDialog - как я могу запустить проверки, когда пользователь нажимает «ОК» - PullRequest
4 голосов
/ 24 января 2011

Могу ли я переопределить положительную кнопку для пользовательского 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?
}
});

break;

Ответы [ 4 ]

6 голосов
/ 24 сентября 2011

Вот обходной путь, пока Google не изменит 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();
  }});
1 голос
/ 24 января 2011

Хорошо, вот только идея того, как это можно реализовать.

AlertDialog.Builder имеет setView(View v) метод.Таким образом, можно добавить, скажем, пользовательский LinearLayout (накачанный из ресурсов прямо перед построением диалога) с кнопкой (кнопками).Затем просто установите обычный android.view.View.OnClickListener(s) на кнопку (и).В этом случае вообще не используйте эти «встроенные / родные» для кнопок AlertDialog.Builder.

0 голосов
/ 21 июля 2013

Я столкнулся с той же проблемой, когда я не смог остановить закрытие диалога, даже когда вход, который я хотел собрать в диалоге, имел проблемы с проверкой. Чтобы решить эту проблему, я добавил кнопки в пользовательском представлении диалога, чтобы лучше контролировать.

Кажется, что нет чистого способа помешать закрытию диалога, если вы используете dialogBuilder's setNeutralButton или setPositiveButton или setNegativeButton.

0 голосов
/ 08 сентября 2011

Вот как я это сделал.Технически, он технически не держит диалог открытым, он на мгновение закрывает его и открывает заново, но чистый результат тот же.

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