2010-06-26 116 views
8

我在Android中使用日期選擇器讓用戶選擇日期。如果用戶選擇一個日期並設置它(我可以正常工作),然後在用戶按下日期選擇器上的取消按鈕時清除某個文本字段(打開日期選擇器但是取消輸出)。如何在Android中爲日期選擇器取消按鈕創建偵聽器?

我一直在努力的方式是通過使

private DatePickerDialog.OnCancelListener mDateCancelListener = 
    new DatePickerDialog.OnCancelListener() { 
     public void onCancel(DialogInterface dialog) { 
      timeClear(); //method that clears text field 
     } 

    }; 

然後我做

TimePickerDialog timeDialog = new TimePickerDialog(this, 
    mTimeSetListener, 
    c.get(Calendar.HOUR), 
    c.get(Calendar.MINUTE), 
    false); 
timeDialog.setOnCancelListener(mTimeCancelListener); 

附加監聽器。

我的問題是,如果用戶按下後退按鈕,偵聽器將工作,但如果他們按下取消按鈕則不會。我嘗試了使用dismiss監聽器,並且工作,除了事實,即使它是否設置或取消日期選擇器!

我需要做什麼以便某些事情發生,當且僅當我按下日期選擇器上的取消按鈕?

+0

我正在嘗試做同樣的事情,但與日期選擇器。在下面提出的解決方案中,應用程序崩潰,因爲.getButton(TimePickerDialog.BUTTON_NEGATIVE)返回null。有沒有人有解決這個問題? – 2010-11-21 12:17:43

+1

檢查此 [1]:http://stackoverflow.com/questions/2928902/can-we-get-cancel-click-listerner-of-datepicker-dialog – W00di 2013-02-14 10:22:07

回答

0

試試這個:

timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE).setOnClickListener(mTimeCancelListener); 

(你必須改變mTimeCancelListener實施DialogInterface.OnClickListener,而不是OnCancelListener)經過一些實驗

+0

感謝您的迴應!我仍然有點麻煩。如果我創建一個DialogInterface.OnClickListener並嘗試將它用於TimePicker,它會告訴我需要先將它投射出去。如果我這樣做,那麼當你點擊按鈕打開TimePicker時,程序就會崩潰。 如果你不那麼它說,在android.view.View setOnClickListener(android.view.View.OnClickListener)不能適用於(android.content.DialogInterface.OnClickListener) timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE) .setOnClickListener(dateTimeClickCancelListener); – Adam 2010-06-27 18:03:49

+0

我嘗試創建一個View.OnClickListner()而不是DialogInterfaceListener,並且當我嘗試打開TimePicker對話框時程序崩潰 – Adam 2010-06-27 18:14:16

1

好吧,我發現,我們需要的是一個OnDismissListener如下圖所示。請注意,我爲TimePickerDialog開發了我的解決方案,但setOnDismissListener從Dialog繼承,所以它對DatePickerDialog應該是一樣的。

timeDialog.setOnDismissListener(mOnDismissListener); 


private DialogInterface.OnDismissListener mOnDismissListener = 
    new DialogInterface.OnDismissListener() { 
     public void onDismiss(DialogInterface dialog) { 
      _logger.v("mOnDismissListener called"); 
      timeClear(); 
     } 
    }; 

我測試了這個,它的工作原理。實際上,我發現OnDismissListener在你提到的兩種場景中都被調用,當用戶點擊Cancel按鈕並且他們點擊硬件後退按鈕時。所以你只需要這一個處理程序。

最後,現在我知道該怎麼谷歌,我發現this article描述差異的OnDismissListener和OnCancelListener之間,在部分「使用辭退監聽器」:

+0

這不是要求的 - 無論按下哪個按鈕,都會觸發onDismiss,但海報想要知道何時按下取消按鈕。他們還表示,他們已經嘗試了一個onDismiss偵聽器。 – barry 2011-11-11 12:46:44

+0

@barry好點..我覺得有趣的是,「onCancelListener」與datePicker對話框上的Cancel按鈕無關。 W00di的評論是正確的答案...所以可能重複。 – giulio 2015-10-13 03:09:40

4

唯一的解決辦法,直覺,是,你需要「越權」的取消按鈕:

timeDialog.setButton(DialogInterface.BUTTON_NEGATIVE, 
      getString(R.string.cancel), 
      new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        // do stuff 
       } 
      }); 
+0

這也調用OnTimeSet方法。所以按順序它稱負面傾聽者然後正面傾聽者。 – 2015-05-13 00:05:36

2

您可以創建一個布爾變量isDataSet和dateSetListener執行isDataSet = TRUE;再附上onDismissListener這樣的代碼:

if(isDataSet) 
    //Data was set and neither back nor cancel button was clicked 
else 
    //back or cancel button was clicked 

但是不要忘記設置每次創建對話框時isDataSet =假。

0

完整的解決方案(測試和工作)是將OnDismissListener(見上面的Kenneth Baltrinic的答案3)和dilix描述的onDateSet布爾(上面的答案)結合在一起。 (1)用戶已選擇實際數據 (2)用戶已取消 (3)用戶已點擊硬件後退按鈕。

使用組合使您能夠區分它們。

0

這是解決方案。它可以幫助任何一個

datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "cancel", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      if (which == DialogInterface.BUTTON_NEGATIVE) { 
       // do something 
      } 
     } 
    }); 
相關問題