【发布时间】:2017-11-21 15:27:59
【问题描述】:
我正在完善我的应用程序并努力确保它不会被破坏。我有一个 CreateLine 页面,最后有一个保存按钮。我正在做测试并试图通过在选择日期或时间选择器之前单击“保存”按钮来破坏我的应用程序,然后应用程序崩溃。基本上我想要发生的是它显示一个警报对话框,说“确保所有字段都已输入”。
问题是我正在使用 JODA-TIME,但我不太确定如何检查或验证这一点?我在我的选择器和保存按钮的代码下方添加了:
日期+时间选择器:
datePickerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
DatePickerDialog datePickerDialog = new DatePickerDialog(CreateLine.this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
monthOfYear = monthOfYear + 1;
String Sd = String.valueOf(dayOfMonth + "/" + monthOfYear + "/" + year);
datePickerButton.setText(Sd);
yearNow = year;
monthNow = monthOfYear;
dayNow = dayOfMonth;
}
}, displayCurrentYear, displayCurrentMonth, displayCurrentDay);
datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
datePickerDialog.show();
}
});
timePickerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TimePickerDialog timePickerDialog = new TimePickerDialog(CreateLine.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int hour, int minute) {
hourNow = hour;
minuteNow = minute;
String St = String.format("%02d:%02d", hour, minute);
timePickerButton.setText(St);
}
}, displayCurrentHour, displayCurrentMinute, isTwentyFourHrsNow);
timePickerDialog.show();
}
});
保存按钮:
VerifyButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (spinner.getSelectedItem().toString().equals("Select Line Type") || spinner2.getSelectedItem().toString().equals("Select Package Type")) {
AlertDialog.Builder builder = new AlertDialog.Builder(CreateLine.this);
builder.setTitle("Data Input Error");
builder.setMessage("Please Ensure that all fields have been selected before Saving!");
builder.setIcon(R.drawable.warning_icon);
builder.setCancelable(true);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
} else if (monthNow >= 1 && monthNow <= 12) {
spinnerSelection = String.valueOf(spinner.getSelectedItem());
spinnerSelection2 = String.valueOf(spinner2.getSelectedItem());
String q = quantity.getText().toString();
String d = duration.getText().toString();
DateTime datetime = new DateTime(yearNow, monthNow, dayNow, hourNow, minuteNow);
DateTimeFormatter fmt = DateTimeFormat.forPattern("EE dd MM yyyy" + "\n" + " h:mm a ");
String formattedtime = fmt.print(datetime);
CalculateButton.setText(formattedtime);
// Plus some hours, minutes, and seconds to the original DateTime.
DateTimeFormatter fmt2 = DateTimeFormat.forPattern("EE dd MM yyyy" + "\n" + " h:mm a ");
DateTime dateTime1 = datetime.plusHours(timeadded);
String endtimecalc = fmt2.print(dateTime1);
TextView endtime = findViewById(endtimetextView);
endtime.setVisibility(View.VISIBLE);
endtime.setText(endtimecalc);
//INSERT DATA TO DATABASE
boolean isInserted = myDb.insertData(
spinnerSelection,
spinnerSelection2,
q,
d,
formattedtime,
endtimecalc);
if (isInserted == true) {
Toast.makeText(CreateLine.this, "Data Inserted Successfully", Toast.LENGTH_LONG).show();
Intent intent = new Intent(CreateLine.this, Dashboard.class);
startActivity(intent);
} else if (isInserted == false) {
AlertDialog.Builder builder = new AlertDialog.Builder(CreateLine.this);
builder.setTitle("Save Data Error");
builder.setMessage("Data for this Line already exists.." + "\n" + "Please Clear Line First!");
builder.setIcon(R.drawable.warning_icon);
builder.setCancelable(true);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(CreateLine.this, Dashboard.class);
startActivity(intent);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
} else {
AlertDialog.Builder builder = new AlertDialog.Builder(CreateLine.this);
builder.setTitle("Save Data Error");
builder.setMessage("No Data has been entered!");
builder.setIcon(R.drawable.warning_icon);
builder.setCancelable(true);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
}
});
}
}
这是我收到的 Logcat 错误:
org.joda.time.IllegalFieldValueException:monthOfYear 的值 0 必须在 [1,12] 范围内 在 org.joda.time.field.FieldUtils.verifyValueBounds(FieldUtils.java:275) 在 org.joda.time.chrono.BasicChronology.getDateMidnightMillis(BasicChronology.java:631) 在 org.joda.time.chrono.BasicChronology.getDateTimeMillis0(BasicChronology.java:186) 在 org.joda.time.chrono.BasicChronology.getDateTimeMillis(BasicChronology.java:182) 在 org.joda.time.chrono.AssembledChronology.getDateTimeMillis(AssembledChronology.java:133) 在 org.joda.time.chrono.ZonedChronology.getDateTimeMillis(ZonedChronology.java:122) 在 org.joda.time.chrono.AssembledChronology.getDateTimeMillis(AssembledChronology.java:133) 在 org.joda.time.base.BaseDateTime.(BaseDateTime.java:257) 在 org.joda.time.base.BaseDateTime.(BaseDateTime.java:198) 在 org.joda.time.DateTime.(DateTime.java:323) 在 com.almac.tracker.CreateLine$6.onClick(CreateLine.java:313)
第 313 行:
DateTime datetime = new DateTime(yearNow, monthNow, dayNow, hourNow, minuteNow);
有谁知道我如何检查或验证这个?
【问题讨论】:
-
在提供的代码中是 CreateLine.java:313 吗?堆栈跟踪的任何部分是否提到 onClick 用于保存按钮或日期选择器?
-
您可以使用 setOnItemSelectedListener() 来验证用户是否进行了选择,而不是比较静态字符串值,这通常是值选择的坏习惯
-
也许你刚刚用零初始化了状态成员
monthNow,并且它没有被日期选择器更新(你只点击了验证按钮吗?)。 -
不会说谎不知道你们是什么意思
-
1.在您的“LongCat”中,除了您发布的内容之外,还有其他内容吗,尤其是在
at com.almac.tracker.CreateLine$6.onClick(CreateLine.java:313)之后? 2. 您能否发布一段CreateLine.java的摘录,其中包括第 313 行,希望是整个方法。
标签: java android validation jodatime