我有四个按钮,显示日历的日期/时间,这是我活动的属性。按下按钮时,将调用相应的DatePickerDialog,用于设置用户在日历对象中输入的值。
虽然日历和对话框的标识看起来是正确的,但当我按下“endDate”并在对话框中单击“确定”时,startDate的文本将被设置。
为什么android会像这样表现并修复这种无意义的行为? (是的,我清理并刷新了项目......)
提前感谢,你总是让我惊讶:)
更新 好的,现在我明白了,我在onTimeSetListener fr startDate而不是MINUTE中设置了MONTH;修复了代码 的 / UPDATE
这是列表: 这是属性定义的一部分(我遗漏了视图)
static final int START_DATE_DIALOG_ID = 0;
static final int START_TIME_DIALOG_ID = 1;
static final int END_DATE_DIALOG_ID = 2;
static final int END_TIME_DIALOG_ID = 3;
这是onCreate()
的相关部分startDate = (Button)findViewById(R.id.startDate);
startTime = (Button)findViewById(R.id.startTime);
endDate = (Button)findViewById(R.id.endDate);
endTime = (Button)findViewById(R.id.endTime);
startCal = Calendar.getInstance();
endCal = Calendar.getInstance();
[......]
startDate.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDialog(START_DATE_DIALOG_ID);
}
});
startTime.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDialog(START_TIME_DIALOG_ID);
}
});
endDate.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDialog(END_DATE_DIALOG_ID);
}
});
endTime.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
showDialog(END_TIME_DIALOG_ID);
}
});
@Override
protected Dialog onCreateDialog(int id) {
switch (id) {
case START_DATE_DIALOG_ID:
return new DatePickerDialog(this,
startDateSetListener,
startCal.get(Calendar.YEAR),
startCal.get(Calendar.MONTH),
startCal.get(Calendar.DAY_OF_MONTH));
case START_TIME_DIALOG_ID:
return new TimePickerDialog(this,
startTimeSetListener,
startCal.get(Calendar.HOUR_OF_DAY),
startCal.get(Calendar.MINUTE),
true); // is24hView
case END_DATE_DIALOG_ID:
return new DatePickerDialog(this,
endDateSetListener,
endCal.get(Calendar.YEAR),
endCal.get(Calendar.MONTH),
endCal.get(Calendar.DAY_OF_MONTH));
case END_TIME_DIALOG_ID:
return new TimePickerDialog(this,
endTimeSetListener,
endCal.get(Calendar.HOUR_OF_DAY),
endCal.get(Calendar.MINUTE),
true); // is24hView
}
return null;
}
private DatePickerDialog.OnDateSetListener startDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
startCal.set(Calendar.YEAR, year);
startCal.set(Calendar.MONTH, monthOfYear);
startCal.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateDisplay(START_DATE_DIALOG_ID);
}
}
;
private DatePickerDialog.OnDateSetListener endDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
endCal.set(Calendar.YEAR, year);
endCal.set(Calendar.MONTH, monthOfYear);
endCal.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateDisplay(START_DATE_DIALOG_ID);
}
}
;
private TimePickerDialog.OnTimeSetListener startTimeSetListener =
new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
startCal.set(Calendar.HOUR_OF_DAY, hourOfDay);
startCal.set(Calendar.MINUTE, minute);
updateDisplay(START_TIME_DIALOG_ID);
}
}
;
private TimePickerDialog.OnTimeSetListener endTimeSetListener =
new TimePickerDialog.OnTimeSetListener() {
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
endCal.set(Calendar.HOUR_OF_DAY, hourOfDay);
endCal.set(Calendar.MINUTE, minute);
updateDisplay(END_TIME_DIALOG_ID);
}
}
;
// updates the date in the TextView
private void updateDisplay(int dialogId) {
switch(dialogId){
case START_DATE_DIALOG_ID:
startDate.setText(getDateFromCal(startCal));
break;
case START_TIME_DIALOG_ID:
startTime.setText(getTimeFromCal(startCal));
break;
case END_DATE_DIALOG_ID:
endDate.setText(getDateFromCal(endCal));
break;
case END_TIME_DIALOG_ID:
endTime.setText(getTimeFromCal(endCal));
break;
}
}
private String getDateFromCal(Calendar cal){
return new StringBuilder()
.append(cal.get(Calendar.DAY_OF_MONTH)) .append(".")
.append(cal.get(Calendar.MONTH) + 1) .append(".")
.append(cal.get(Calendar.YEAR)) .toString();
}
private String getTimeFromCal(Calendar cal){
StringBuilder sb = new StringBuilder();
int num = cal.get(Calendar.HOUR_OF_DAY);
if(num<10)
sb.append("0");
sb.append(num);
sb.append(":");
num = cal.get(Calendar.MINUTE);
if(num<10)
sb.append("0");
sb.append(num);
return sb.toString();
}
答案 0 :(得分:1)
您正在从听众START_DATE_DIALOG_ID
更新错误的显示(endDateSetListener
)。
private DatePickerDialog.OnDateSetListener endDateSetListener =
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
endCal.set(Calendar.YEAR, year);
endCal.set(Calendar.MONTH, monthOfYear);
endCal.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateDisplay(START_DATE_DIALOG_ID);
}
}
;
另外 - 我可以提出建议吗?语言或图书馆是一个非常罕见的问题;从不认为它是。 Jeff Atwood(创办StackOverflow的人之一)有一篇关于这个主题的优秀文章:First rule of programming: It's always your fault