在应用程序对该数据进行一些数学运算之前,我在用户必须完成的应用程序中有更多字段。由于跳过一个字段然后应用程序崩溃的可能性,我插入了一些故障安全触发器。 例如:
EditText vZeitE = (EditText) findViewById(vZeit);
if (vZeitE.getText().toString().length() == 0) {
vZeitE.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(vZeitE, InputMethodManager.SHOW_IMPLICIT);
vZeitE.setError(getString(R.string.ErrStringVZeitMissing));
} else {
首先获取字段内容,检查其长度,如果是0,则进行下一次字段检查,如果长度为0,则表示没有输入数据,用户将收到错误消息,光标将变为空场,迫使他输入价值。
现在,一遍又一遍地这样做(因为它几乎在所有的方法中使用)开始让我失望。我说我可以尝试为每个字段检查定义一个方法,并在需要时用另一种方法调用它。 所以我这样做了:
我在这里定义方法:
public void checkBeginnTime() {
EditText EtimpAnfang = (EditText) findViewById(timpAnfang);
if (EtimpAnfang.getText().toString().length() == 0) {
EtimpAnfang.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(EtimpAnfang, InputMethodManager.SHOW_IMPLICIT);
EtimpAnfang.setError(getString(R.string.ErrStringAnfangZeitMissing));
}
}
这里我用新方法替换旧代码:
findViewById(R.id.buttoSaveCalcOR)
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle(getString(R.string.sOptionSave) + " (" + getString(R.string.sButOhneRust) + ") ");
builder.setMessage(getString(R.string.sConfirmOption));
builder.setPositiveButton(getString(R.string.sJa), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
EditText edTimpAnfang = (EditText) findViewById(timpAnfang);
checkBeginnTime();
// if (edTimpAnfang.getText().toString().length() == 0) {
// edTimpAnfang.requestFocus();
// InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// imm.showSoftInput(edTimpAnfang, InputMethodManager.SHOW_IMPLICIT);
// edTimpAnfang.setError(getString(R.string.noinput));
// } else {
EditText EaufGesSt = (EditText) findViewById(aufGesSt);
checkTotalOrder();
EditText vZeitE = (EditText) findViewById(vZeit);
checkDefaultTime();
问题在于它向我显示数据丢失,但不会停止让我修复丢失的数据,只是更进一步,执行方法中的其他剩余行,而不管字段的长度是0。
在这种情况下,我用它来存储优先级中每个字段的值,以后能够加载这些值。在我无法保存此值之前,除非evety字段的长度> 0,现在,即使长度为0,也存储了一些内容,如果我加载数据并尝试进行数学计算,显然它会使应用程序崩溃。
你能解释一下我做错了什么吗?为什么在一种情况下它起作用而在另一种情况下只是进入下一行......忽略了字段长度不应该为0的事实......?!
谢谢!
答案 0 :(得分:1)
你需要让checkBeginnTime()
返回一个布尔值,如果field为OK则返回true,否则返回false,
并根据checkBeginnTime()
结果,继续或停止该过程:
public boolean checkBeginnTime() {
EditText EtimpAnfang = (EditText) findViewById(timpAnfang);
if (EtimpAnfang.getText().toString().length() == 0) {
EtimpAnfang.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(EtimpAnfang, InputMethodManager.SHOW_IMPLICIT);
EtimpAnfang.setError(getString(R.string.ErrStringAnfangZeitMissing));
return false;
}
return true;
}
和使用部分(buttoSaveCalcOR onClick):
//:
//:
EditText edTimpAnfang = (EditText) findViewById(timpAnfang);
if(!checkBeginnTime()){
return;
}
//:
//:
注意:还有其他方法,灵活,验证视图中的所有EditTexts(在屏幕中)我可以根据需要向您展示示例,但它可能看起来有点复杂,除非你可以学习很少的新东西。
我这样说是因为你所做的不是你真正需要的,因为你仍然需要为每个视图制作一个方法?!并调用它,所以至少你可以将View(EditText)传递给方法这样你可以多次调用同一个方法。