2013-04-24 120 views
2

我正在寫一個應用程序,用戶需要指定一個給定的時間點,但我似乎無法弄清楚如何設置用戶可以選擇的分鐘值,只使用增量5而不是增量1.如何更改Android TimePicker分鐘間隔?

簡而言之,當通過可用量的用戶滾動,他/她必須只看到0,5,10,15等

預先感謝您。

回答

0

您可以通過編程來完成此操作。

pickStartTime = (TimePicker)findViewById(R.id.StartTime); 
pickStartTime.setOnTimeChangedListener(mStartTimeChangedListener); 
int nextMinute = 0; 

接下來,將OnTimeChangedListener如下圖所示

private TimePicker.OnTimeChangedListener mStartTimeChangedListener = 
    new TimePicker.OnTimeChangedListener() { 
     public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { 
      updateDisplay(view, startDate, hourOfDay, minute);   
     } 
    }; 

private TimePicker.OnTimeChangedListener mNullTimeChangedListener = 
    new TimePicker.OnTimeChangedListener() { 
     public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {} 
    }; 

而且,

private void updateDisplay(TimePicker timePicker, Date date, int hourOfDay, int minute) 
{ 
    nextMinute = nextMinute+5; 

    // remove ontimechangedlistener to prevent stackoverflow/infinite loop 
    timePicker.setOnTimeChangedListener(mNullTimeChangedListener); 

    // set minute 
    timePicker.setCurrentMinute(nextMinute); 

    // look up ontimechangedlistener again 
    timePicker.setOnTimeChangedListener(mStartTimeChangedListener); 

    // update the date variable for use elsewhere in code 
    date.setMinutes(nextMinute); 
} 
+1

這段代碼的rusult是唯一的量,我可以看到的是5,也許我實現它錯了嗎? – JeanBrand 2013-04-24 09:33:28

+0

你必須增加它,看我編輯的答案 – 2013-04-24 09:55:02

+2

它的工作原理是用戶只能選擇5的增量,但顯示結果的頂部和底部的選項不是5的增量,你知道我可以如何將微調器中可用的金額綁定爲5的增量? – JeanBrand 2013-04-29 12:23:44

2

所有相關答案需要你設置一個OnTimeChangedListener。 我的決心是你的android延伸TimePicker,並修改它的構造函數:

// minute 
    mMinuteSpinner = (NumberPicker) findViewById(R.id.minute); 
    mMinuteSpinner.setMinValue(0); 
    mMinuteSpinner.setMaxValue(3); 
    mMinuteSpinner.setDisplayedValues(new String[]{"0", "15", "30", "45"}); 
    mMinuteSpinner.setOnLongPressUpdateInterval(100); 
    mMinuteSpinner.setFormatter(NumberPicker.getTwoDigitFormatter()); 

所以你可以有你想要的時間間隔。

+1

這對我們很有用,但是我們對微調微調的搜索有點不明白,因爲它不知道「R.id.minute」是什麼。 'R.id.minute'從哪裏來? – Dan2552 2014-02-03 15:40:14

+0

@ Dan2552'R.id.minute'是TimePicker中使用的分鐘旋鈕的標識。你可以在'/res/layout/time_picker.xml'中找到它。 – 2014-03-24 15:15:47

+1

對不起,現在評論,但如果你正在擴展'TimePicker'並想訪問'NumberPicker's的ID,你可以通過'com.android.internal.R.id.minute/hour'來完成。 – Asaf 2014-07-17 20:23:00

0

搜索網絡後,我沒有找到最簡單的解決方案。
所以我決定分享:
你可以使用反射!
以下代碼使用10分鐘的時間間隔,但您可以選擇要在DISPLAYED_MINS數組中使用的分鐘數。

private final static String[] DISPLAYED_MINS = { "0", "10", "20", "30", "40", "50" }; 

private NumberPicker getMinuteSpinner(TimePicker t) 
{ 
    try 
    { 
     Field f = t.getClass().getDeclaredField("mMinuteSpinner"); // NoSuchFieldException 
     f.setAccessible(true); 
     return (NumberPicker) f.get(t); // IllegalAccessException 
    } 
    catch (Exception e) 
    { 
     Log.e("timepicker","field name has been changed, check grepcode"); 
     return null; 
    } 
} 

當您創建timepicker:

final TimePicker dpStartDate = (TimePicker) view.findViewById(R.id.dpStartDate); 
NumberPicker startMinSpiner = getMinuteSpinner(dpStartDate); 
if (null != startMinSpiner) 
{ 
    startMinSpiner.setMinValue(0); 
    startMinSpiner.setMaxValue(DISPLAYED_MINS.length - 1); 
    startMinSpiner.setDisplayedValues(DISPLAYED_MINS); 
} 

但不要忘記,getCurrentMinute()的DISPLAY_MINS數組中返回選定分鐘。 爲了獲得分:

int theTime = 0; 
for (String number: DISPLAYED_MINS) { 
    int theNumber = Integer.parseInt(number); 
    if (theNumber % 5 != 0) { 
     theNumber = ((int)(theNumber/5)) * 5; 
    } 
    if (theNumber == dpStartDate.getCurrentMinute()) { 
     theTime = theNumber; 
     break; 
    } 
} 
+4

僅供參考,這不再適用於Android L/Lollipop。 – 2014-12-04 00:33:32

2

要確保你與API兼容21+,請確保您有TimePicker以下屬性:

android:timePickerMode="spinner" 

然後這裏是你如何設置的時間間隔編程。這個方法倒在標準TimePicker如果分字段不能發現:

private static final int INTERVAL = 5; 
private static final DecimalFormat FORMATTER = new DecimalFormat("00"); 

private TimePicker picker; // set in onCreate 
private NumberPicker minutePicker; 

public void setMinutePicker() { 
    int numValues = 60/INTERVAL; 
    String[] displayedValues = new String[numValues]; 
    for (int i = 0; i < numValues; i++) { 
     displayedValues[i] = FORMATTER.format(i * INTERVAL); 
    } 

    View minute = picker.findViewById(Resources.getSystem().getIdentifier("minute", "id", "android")); 
    if ((minute != null) && (minute instanceof NumberPicker)) { 
     minutePicker = (NumberPicker) minute; 
     minutePicker.setMinValue(0); 
     minutePicker.setMaxValue(numValues - 1); 
     minutePicker.setDisplayedValues(displayedValues); 
    } 
} 

public int getMinute() { 
    if (minutePicker != null) { 
     return (minutePicker.getValue() * INTERVAL); 
    } else { 
     return picker.getCurrentMinute(); 
    } 
}