在提交数据之前,我有一系列适用于用户输入的验证。每次验证如果失败,将弹出一个对话框给用户。
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中的警报对话框没有阻止,我认为必须重写该方法:比如将可覆盖的验证与其他验证分开?
有什么想法吗?
答案 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();
}