验证对话框输入

时间:2010-05-09 21:20:30

标签: android alertdialog

我使用的AlertDialog非常简单,只是带有文本框的自定义视图,以及alertdialog肯定提交按钮。我想验证文本框是否在用户解除对话框之前输入了文本。我看到了两种可能性,每种都有问题:

  • 禁用提交按钮,直到 文本框不为空(在某些情况下) onChange()类型的文本处理程序 框)
    • 您如何知道文本框的内容何时发生变化?
    • 如何获得对AlertDialog按钮对象的引用?
  • 检查提交按钮 onClick()并取消解雇 对话框,如果它是空的。
    • 是否可以使用AlertDialog按钮执行此操作?对话框在没有手动调用dismiss()或cancel()的情况下解散,所以我不确定......

使用AlertDialog(与自定义对话框相比)是否可以使用其中任何一个选项?

我认为第二种选择是最简单的,但是如果可能的话,我也要努力。

3 个答案:

答案 0 :(得分:5)

我将TextWatcher设置为输入字段,然后在满足验证条件时启用肯定按钮。我默认禁用了正面按钮。

AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity());
final View dialogView = LayoutInflater.from(getSherlockActivity()).inflate(R.layout.create_playlist, null);
final EditText inputField = (EditText) dialogView.findViewById(R.id.edit_newPlaylistName);
... //proceed to setup dialog using builder
final AlertDialog alertDialog = builder.show();
alertDialog.setCanceledOnTouchOutside(true);
final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false);
inputField.addTextChangedListener(new TextWatcher() {
    @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // my validation condition
        if (inputField.getText().length() > 0) {
           button.setEnabled(true);
        } else {
           button.setEnabled(false);
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
});

答案 1 :(得分:3)

我认为最简单的方法是在xml文件中定义自己的对话框。然后你可以非常简单地显示它(在这个例子中活动类的某个地方):

Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.your_dialog_file);

Button yourButton = dialog.findViewById(R.id.yourButton);
final EditText text = dialog.findViewById(R.id.yourTextEdit);
yourButton.setOnClickListener( {

public void onClick(View view) {
   if ( ! (text.getText().toString.equals(""))) {
        //go on here and dismiss dialog
   }

});

答案 2 :(得分:1)

如果输入无效,这里有一种验证输入并在屏幕上保留警告对话框的方法。实际上,它删除了对话框并提供了它的新副本。

在你的setPostiveButton的onClick函数中,进行验证。 如果事情不是他们应该的,请向用户显示Toast。 然后在对话框中调用removeDialog。 然后 - 这是棘手的部分,异步调用对话框中的showDialog(如果适用,使用args)。 另外:为了不丢失用户的输入,您应该将他们输入的值放入您调用对话框的包中。当然,对话框的设置代码需要在包中查找这些值并适当地预填充对话框字段。

所以你的代码看起来像这样:

alert.setPositiveButton(id,
new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) 
    {
    if ((your validation conditions)) {
        // validation conditions not satisfied
        removeDialog(myDialogId);
        Toast.makeText(blah blah).show();
        // now create a new args bundle for the dialog
        Bundle newArgs = new Bundle();
        // now copy whatever you need from the args used to invoke to dialog
        newArgs.putIntegerArrayList("items", myList);
        // now save the user's input in a bundle
        newArgs.putString("dialogToFieldContent", toString);
        final Bundle finalArgs = newArgs;
        Handler handler = new Handler();
        handler.post(new Runnable() {
            @Override
            public void run() {
            showDialog(myDialogId, finalArgs);
            }
        });
    }
    else {
        // if everything is ok
    }
    }
});