2013-06-28 77 views
1

當我更改日期時,OnDateSetListener()未被調用。即使setMinDate(day);行不起作用。我認爲出於某種原因DatePickerDialog還沒有註冊OnDateSetListener()。但無法弄清楚。我已經聲明對話框和偵聽器都是全局的。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

嘗試將'datePicker = new DatePickerDialog(this,dateListener,year,month,day);'在'dateListener'定義之後'。 –

+0

@Rapunzel我正在嘗試相同的。它調用監聽器,但是兩次。而setMinDate()仍然不起作用。 – Geek

+0

其中你叫createDatePicker()。 – Sam

回答

1

創建DatePickerDialog聲明聽衆後,就像Rapunzel說的。

偵聽器將無法工作,因爲當您創建DatePickerDialog實例時,dateListener爲空。 DatPickerDialog對象將不會檢測到對您的偵聽器所做的更改。

EDIT

因爲dateListener是在()調用DatePickerDialog的時間空。如果您查看DatePickerDialog的source,您將看到私有的最終OnDateSetListener mCallback。這意味着它引用null。該引用變得不可變,因爲它是最終的。 dateListener = new DatePickerDailog.OnDateSetListener將在內存中的其他位置創建實例(因爲新關鍵字),導致引用發生變化。 DatePickerDialog.mCallback中的引用不會更改,因爲它是不可變的。

+0

我已經嘗試過,並在調用中的偵聽器方法。但我想知道爲什麼'DatePickerDialog'不會看到對偵聽器的更改,因爲它有一個對它的引用。並有參考意味着有最新的副本。 – Geek

+1

由於在調用DatePickerDialog()時dateListener爲'null'。如果你看看DatePickerDialog的[http://goo.gl/P04hz](source),你會看到'private final OnDateSetListener mCallback'。這意味着它引用'null'。該引用變得不可變,因爲它是最終的。 'dateListener = new DatePickerDailog.OnDateSetListener'將在內存中的其他位置創建實例(因爲'new'關鍵字),導致引用發生變化。 'DatePickerDialog.mCallback'中的引用不會改變,因爲它是不可變的。 –

+0

您可以在調試模式下運行您的應用程序,並在調用'dateListener = new DatePickerDailog.OnDateSetListener'後查找DatePickerDialog.mCallback'包含的內容。我很好奇你會找到什麼。 –

相關問題