2013-04-24 4 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

+0

вы должны увеличить его, см. Мой отредактированный ответ –

+2

Он работает в том смысле, что пользователь может выбирать только приращения 5, но параметры в верхней и нижней частях отображаемого результата не являются шагом в 5, вы знаете, как я могу связать суммы, доступные в счетчике, только с шагом 5? – JeanBrand

2

все относительно ответ нужно, чтобы установить OnTimeChangedListener. Моего решения является то, что вы расширяете андроид 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

+0

@ Dan2552 'R.id.minute' является идентификатором минутного счетчика, используемого в TimePicker. Вы можете найти его в '/res/layout/time_picker.xml'. –

+1

Извините за комментарий сейчас, но если вы расширяете 'TimePicker' и хотите получить доступ к идентификаторам' NumberPicker', вы можете сделать это, используя 'com.android.internal.R.id.minute/hour'. – Asaf

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

Просто FYI, это больше не работает в Android L/Lollipop. –

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(); 
    } 
}