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ラプンツェルが言ったように、リスナーを宣言した後に作成します。

インスタンスdateListenerを作成するとnullになるため、リスナーは機能しません。DatePickerDialogオブジェクトは、DatPickerDialogリスナーに加えられた変更を検出しません。

編集

DatePickerDialog() の呼び出し時に dateListener が null であるためです。DatePickerDialogのソースを見ると、プライベートの最終的な OnDateSetListener mCallback が表示されます。つまり、null を参照しています。その参照は最終的なものであるため、不変になります。dateListener = new DatePickerDailog.OnDateSetListener は、( new キーワードのため) メモリ内の別の場所にインスタンスを作成し、参照を変更します。不変であるため、DatePickerDialog.mCallback の参照は変更されません。

于 2013-06-28T08:29:19.903 に答える