2011-09-02 425 views
2

我正在做一個Android應用程序,我有一個問題。 (我是Android開發新手。)如何設置第二天的鬧鐘時間?

在我的應用程序中,我想爲今天設置鬧鐘。它適用於此,但我的問題是當我想從時間選擇器中設置時間小於當前時間時,我的鬧鐘立即響起。我想把時間設定爲明天的時間。我怎麼做?

+0

顯示您用於設置鬧鐘的代碼。 – Femi

回答

16

只需在設置警報之前檢查時間選擇器的結果。我不確定你的鬧鐘設置是怎樣的,或者你甚至使用了什麼樣的鬧鐘,我會假設給你一個毫秒的時間,你可以解決它。

public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { 
    Calendar now = Calendar.getInstance(); 
    Calendar alarm = Calendar.getInstance(); 
    alarm.set(Calendar.HOUR_OF_DAY, hourOfDay); 
    alarm.set(Calendar.MINUTE, minute); 
    long alarmMillis = alarm.getTimeInMillis(); 
    if (alarm.before(now)) alarmMillis+= 86400000L; //Add 1 day if time selected before now 
    setAlarm(alarmMillis); 
} 

public void setAlarm(long millis) { 
    /** Set your alarm here */ 
} 

還有很多其他的方法可以做到這一點,但我覺得Calendar類是通常用於初學者時間操作好。希望這可以幫助。

編輯: 如果DST是一個問題,一個小編輯就能解決問題:

public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { 
    Calendar now = Calendar.getInstance(); 
    Calendar alarm = Calendar.getInstance(); 
    alarm.set(Calendar.HOUR_OF_DAY, hourOfDay); 
    alarm.set(Calendar.MINUTE, minute); 
    if (alarm.before(now)) alarm.add(Calendar.DAY_OF_MONTH, 1); //Add 1 day if time selected before now 
    setAlarm(alarm.getTimeInMillis()); 
} 

您將需要確保時區設置正確。上述代碼將使用系統根據Android Locale設置設置的默認時區。使用Calendar.getInstance(TimeZone區域)獲取特定時區中的日曆對象。

+0

+1,但請注意,在DST更改時這不會按預期工作。考慮使用喬達時間庫。 –

+0

Thx Donal - 忘記了 - 我已編輯處理DST。 –

+0

不知道他們是否改變了命名,但在2.1中,函數是「before()」而不是「isBefore()」......以防有人遇到問題。 –

0

這是我在我的項目中使用的代碼。我得到日曆的實例,然後設置所需的時間並將其與實際時間值進行比較,如果它小於零(過去),我向它添加一天。希望能幫助到你。

Calendar c = Calendar.getInstance(); 
    c.set(Calendar.HOUR_OF_DAY, hour); 
    c.set(Calendar.MINUTE, minute); 
    c.set(Calendar.SECOND, second); 
    long timeInMillis = c.getTimeInMillis(); 
    if(timeInMillis-System.currentTimeMillis()<0){ 
     //if its in past, add one day 
     timeInMillis += 86400000; 
    } 
    //for instance start repeating intent 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent);