有没有办法阻止AlertDialog无效输入关闭?

问题描述:

我正在使用带正面和取消按钮的简单文本字段警报对话框。如果输入无效,我想验证我的警报对话框并防止完成按钮关闭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

对不起,我刚刚注意到这是[this(unaccepted)question](http://*.com/q/4785571/403455)的重复。我将它作为一个副本关闭,但我正在寻找更好的答案。如果答案是“不”,那就这样吧。 –

+1

创建自己的自定义对话框似乎是基于[先前的问题](http://*.com/questions/4016313/how-to-keep-an-alertdialog-open-after-button-onclick-是烧)。看起来这将是最简单的解决方案,而这正是我过去不得不做的。 – theisenp

+0

我在投票你的问题。让我们看看Discplined徽章是否适用于问题:) – EboMike

下面是我做到的。从技术上讲,它在技术上并没有保持对话框打开,它暂时关闭并重新打开它,但最终结果是相同的。

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