当我更改日期时,OnDateSetListener()
未被调用。即使setMinDate(day);
行无效。我认为由于某种原因,DatePickerDialog
尚未注册OnDateSetListener()
。但无法弄明白。我已经将对话框和监听器都声明为全局。
private DatePickerDialog datePicker;
private DatePickerDialog.OnDateSetListener dateListener;
代码:
// Create dialogs for datePicker
private void createDatePicker() {
Calendar calendar = Calendar.getInstance(Locale.getDefault());
int day = calendar.get(Calendar.DAY_OF_MONTH);
int month = calendar.get(Calendar.MONTH);
int year = calendar.get(Calendar.YEAR);
datePicker = new DatePickerDialog(this, dateListener, year, month, day);
datePicker.getDatePicker().setMinDate(day);
dateListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
Log.d(TAG, "Date changed.");
}
};
}
private void setEditTextListeres() {
myEditText.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
Log.d(TAG, "EditText gained focus.");
datePicker.show();
}
}
});
}
知道为什么不听电话听众?为什么setMinDate()不起作用?
答案 0 :(得分:4)
在你宣布听众之后创建DatePickerDialog
,就像Rapunzel说的那样。
侦听器无效,因为dateListener
在创建DatePickerDialog
实例时为空。 DatPickerDialog
对象不会检测对您的侦听器所做的更改。
修改强>:
因为在调用DatePickerDialog()时dateListener为null。如果查看DatePickerDialog的source,您将看到私有的最终OnDateSetListener mCallback。这意味着它引用了null。该引用变为不可变,因为它是最终的。 dateListener = new DatePickerDailog.OnDateSetListener将在内存中的其他位置创建实例(因为new关键字),导致引用发生更改。 DatePickerDialog.mCallback中的引用不会更改,因为它是不可变的。