Android EditText验证可以继续

时间:2014-12-11 17:49:57

标签: android validation alertdialog android-alertdialog

在提交数据之前,我有一系列适用于用户输入的验证。每次验证如果失败,将弹出一个对话框给用户。

if (check_1() == false) {
    popup(MSG_1);
    return false;
}
if (check_2() == false) {
    popup(MSG_2);
    return false;
}
...

我的问题是,我希望其中一个验证可由用户覆盖,例如下面的check_2

if (check_1() == false) {
    popup(MSG_1);
    return false;
}
if (check_2() == false) {
    boolean res = popup_with_override(MSG_2);   // confirmation dialog
    if (res == false)
       return false;
    // otherwise continue with the validation tests
}
if (check_3() == false) {
    popup(MSG_3);
    return false;
}
...

我尝试使用类似下面的类的确认对话框,但它不适合一个接一个地验证的测试列表的想法。

public abstract static class DialogCallback implements DialogInterface.OnClickListener, Runnable {
    public DialogCallback(Context c, String q) {
        AlertDialog.Builder builder = new AlertDialog.Builder(c);
        builder.setMessage(q)
                .setPositiveButton("Yes", this)
                .setNegativeButton("No", this);
        builder.create().show();
    }

    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
        if (which == DialogInterface.BUTTON_POSITIVE) {
            mWhich = DialogInterface.BUTTON_POSITIVE;
            run();
        } else {
            mWhich = DialogInterface.BUTTON_NEGATIVE;
            run();
        }
    }

    //
    public int mWhich;
}

由于Android中的警报对话框没有阻止,我认为必须重写该方法:比如将可覆盖的验证与其他验证分开?

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

最后,我使用以下方法来满足我的需求(循环多个可覆盖的验证),如果它可以帮助其他人:

1)我的检查功能不再返回布尔值。相反,如果出现错误,我们只收集List<ValidationError>中的错误,ValidationError是一个包含错误消息的类,相关的EditText(如果是全局错误则为null)和布尔值overridable(或不)。因此验证码变为:

if (check_1() == false) {
    // non-edittext specific error
    ValidationErrors.add(new ValidationError(MSG_1, null, false)); 
}
if (check_2() == false) {
    // overridable error = warning
    ValidationErrors.add(new ValidationError(MSG_2, editText2, true)); 
}
if (check_3() == false) {
    // edittext specific error
    ValidationErrors.add(new ValidationError(MSG_3, editText3, false)); 
}

2)然后验证方法允许继续实际工作或警告/停止用户:

void Validate() {

    ArrayList<String> warnings = new ArrayList<String>();

    for (ValidationError ve : ValidationErrors) {
        // global err : display & return
        if (ve.editText == null && !ve.overridable) {
            popup(ve.message);
            return;
        }
        // local err : mark the edittext & return
        if (ve.editText != null && !ve.overridable) {
            ve.editText.setError(ve.message);
            return;
        }
        // global warning : collect the message
        if (ve.editText == null && ve.overridable) {
            warnings.add(ve.message);
        }
        // local warning : mark the edittext & collect the message
        if (ve.editText != null && ve.overridable) {
            ve.editText.setError(ve.message);
            warnings.add(ve.message);
        }
    }

    // Confirm (or not) the warnings
    ConfirmWarnings(warnings);
}

3)最后,ConfirmWarnings方法是递归的,因此如果有的话,它可以遍历所有警告:

void ConfirmWarnings(ArrayList<String> warns) {
    if (warns.size() > 0) {
        new DialogCallback(this, warns.get(0) + ", continue ?", tags) {
            @override
            public void run() {
                if (this.mWhich == DialogInterface.BUTTON_POSITIVE) {
                    warns.remove(0); // consume the warnings as they are accepted
                    ConfirmWarnings(warns);
                }
            }
        }
    }
    else 
        RealWork();
}