2011-06-28 8 views
16

私は、肯定とキャンセルボタンが付いた簡単なテキストフィールド警告ダイアログを使用しています。私は警告ダイアログを検証し、入力が無効であれば終了ボタンがAlertDialogを閉じるのを防ぎたい。AlertDialogが無効な入力で閉じないようにする方法はありますか?

カスタムダイアログを作成して、検証が失敗した場合にPositiveButton onClick()ハンドラがダイアログを閉じるのを防ぐ方法がありますか?

class CreateNewCategoryAlertDialog { 
    final EditText editText; 
    final AlertDialog alertDialog; 

    class PositiveButtonClickListener implements OnClickListener { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      String name = editText.getText().toString(); 
      if(name.equals("")) { 
       editText.requestFocus(); 
       editText.setError("Please enter a name"); 
       // Some code to stop AlertDialog from closing goes here... 
      } else { 
       doSomethingUsefulWithName(); 
      } 
     } 
    } 

    AlertDialog buildAlertDialog(Context context) { 
     return new AlertDialog.Builder(context) 
     .setTitle(context.getString(R.string.enter_name)) 
     .setMessage(context.getString(R.string.enter_name_msg)) 
     .setView(editText) 
     .setPositiveButton(context.getString(R.string.done), new PositiveButtonClickListener()) 
     .setNegativeButton(context.getString(R.string.cancel), null).create(); 
    } 
} 
+0

は申し訳ありませんが、私は、これは[この(未承認)質問](http://stackoverflow.com/q/4785571/403455)の複製である気づきました。私は重複としてそれを閉じるだろうが、私はより良い答えを探しています。答えが「いいえ」の場合は、それになります。 –

+1

独自のカスタムダイアログを作成する方法は、[以前の質問](http://stackoverflow.com/questions/4016313/how-to-keep-an-alertdialog-open-after-button-onclick-撃たれた)。それが最も簡単な解決策になるようですが、それは私が過去にしなければならなかったことです。 – theisenp

+0

あなたの質問を投票しています。 Disciplinedバッジが質問に当てはまるかどうかを見てみましょう:) – EboMike

答えて

9

ここで私はそれをしました。技術的には、それは技術的にダイアログを開いたままにしておらず、一時的に閉じて再オープンしますが、結果は同じです。

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; 
    } 
} 
関連する問題