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

4 に答える 4

6

GoogleがDialogAPIを変更するまでの回避策は次のとおりです。

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();
  }});
于 2011-09-23T21:18:58.627 に答える
1

わかりました、これは実装方法の単なるアイデアです。

AlertDialog.BuildersetView(View v)メソッドを持っています。したがって、たとえば、ボタンを使用してカスタムLinearLayout(ダイアログ構築の直前にリソースから膨張) を追加することができます。android.view.View.OnClickListener(s)次に、ボタンを通常に設定します。この場合、AlertDialog.Builderボタンにこれらの「組み込み/ネイティブ」を使用しないでください。

于 2011-01-24T18:59:00.760 に答える
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;
    }
}
于 2011-09-08T17:51:45.260 に答える