3

当我更改日期时,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() 不起作用?

4

1 回答 1

5

DatePickerDialog就像 Rapunzel 说的那样,在声明监听器之后创建。

侦听器将不起作用,因为创建实例dateListener时为 null 。DatePickerDialogDatPickerDialog对象不会检测到对您的侦听器所做的更改。

编辑

因为在调用 DatePickerDialog() 时 dateListener 为空。如果您查看 DatePickerDialog 的源代码,您将看到私有 final OnDateSetListener mCallback。这意味着它引用了 null。该引用变得不可变,因为它是最终的。dateListener = new DatePickerDailog.OnDateSetListener 将在内存中的其他位置创建实例(因为 new 关键字),导致引用发生变化。DatePickerDialog.mCallback 中的引用不会改变,因为它是不可变的。

于 2013-06-28T08:29:19.903 回答