为什么我的代码使用侦听器将值设置为错误的视图

时间:2011-09-11 17:51:09

标签: java android

我有四个按钮,显示日历的日期/时间,这是我活动的属性。按下按钮时,将调用相应的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();
}

1 个答案:

答案 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