Как установить минутный интервал в DialogFragment

Я пытаюсь установить 10-минутный интервал в Android DialogFragment (предложено Google), но я действительно не могу найти способ сделать это.

Вот класс фрагмента, который показывает диалог:

public class TimePickerFragment extends DialogFragment
        implements TimePickerDialog.OnTimeSetListener {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current time as the default values for the picker
        final Calendar c = Calendar.getInstance();
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);

        // Create a new instance of TimePickerDialog and return it
        return new TimePickerDialog(getActivity(), this, hour, minute,
                DateFormat.is24HourFormat(getActivity()));
    }

    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {

        String realMinute= "";

        switch (minute) {
            case 1:
                realMinute = "01";
                break;
            case 2:
                realMinute = "02";
                break;
            case 3:
                realMinute = "03";
                break;
            case 4:
                realMinute = "04";
                break;
            case 5:
                realMinute = "05";
                break;
            case 6:
                realMinute = "06";
                break;
            case 7:
                realMinute = "07";
                break;
            case 8:
                realMinute = "08";
                break;
            case 9:
                realMinute = "09";
                break;
            default:
                realMinute = String.valueOf(minute);
                break;
        }

        final String selectedDate = String.valueOf(hourOfDay) + ":" + realMinute;
        EditText selectedTimeTxt = (EditText) getActivity().findViewById(R.id.selectedTime);
        selectedTimeTxt.setText(selectedDate);
    }

Все работает так, как ожидалось, но мне нужно, чтобы пользователь мог выбирать только интервалы в 10 минут, например 1:10, 1:20, 1:30, 1:40 и т. д.

Можно ли изменить его или как-то расширить, чтобы он соответствовал моим потребностям? Я знаю, что здесь я упускаю из виду один основной момент, но как новичок я не могу его заметить.

ИЗМЕНИТЬ

Вот мои взгляды:

введите здесь описание изображения


person Slim    schedule 05.02.2015    source источник
comment
Быстрый поиск в Google позволил мне ответить на этот вопрос: stackoverflow.com/questions/7713538/   -  person cYrixmorten    schedule 07.02.2015
comment
@cYrixmorten Я пробовал, и это не работает. просто умножьте минуты на значение интервала. Также нет никаких визуальных изменений на сборщике. :(   -  person Slim    schedule 07.02.2015
comment
Как насчет создания собственного диалогового окна выбора времени с использованием представлений TimePicker, таких как stackoverflow .com/questions/2580216/? TimePicker позволяет вам установить, какие значения он имеет, поэтому вы можете использовать [10, 20, 30,..] в качестве вариантов для минут.   -  person cYrixmorten    schedule 07.02.2015


Ответы (1)


Вы можете установить свои собственные значения для 2-го средства выбора номера (средства выбора минут) с помощью вызова setDisplayedValues. Однако сначала вам нужно найти представление NumberPicker.

Android Device Monitor имеет удобную функцию захвата экрана устройства и отдельных представлений, поэтому вы можете найти идентификатор (или путь) к нужному виду:

введите здесь описание изображения

Поскольку ваш новый массив значений содержит 6 значений (0...5), вам нужно будет преобразовать текущие минуты в десятки, чтобы не выйти за пределы допустимого диапазона.

Вот полный пример:

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Calendar c = Calendar.getInstance();
    int hour = c.get(Calendar.HOUR_OF_DAY);
    // Convert current minutes to tens
    // 55 = 50, 56 = 00
    int minute = c.get(Calendar.MINUTE) / 10;
    minute = (minute > 5) ? 0 : minute;

    // Create a new instance of TimePickerDialog and return it
    final TimePickerDialog tpd = new TimePickerDialog(getActivity(), this, hour, minute,
            DateFormat.is24HourFormat(getActivity()));

    tpd.setOnShowListener(new DialogInterface.OnShowListener() {
        @Override
        public void onShow(DialogInterface dialog) {
            int tpLayoutId = getResources().getIdentifier("timePickerLayout", "id", "android");

            ViewGroup tpLayout = (ViewGroup) tpd.findViewById(tpLayoutId);
            ViewGroup layout = (ViewGroup) tpLayout.getChildAt(0);

            // Customize minute NumberPicker
            NumberPicker minutePicker = (NumberPicker) layout.getChildAt(2);
            minutePicker.setDisplayedValues(new String[]{"00", "10", "20", "30", "40", "50"});
            minutePicker.setMinValue(0);
            minutePicker.setMaxValue(5);
        }
    });

    return tpd;
}

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    minute = minute * 10;
    Toast.makeText(getActivity(), "Selected minute: " + minute, Toast.LENGTH_LONG).show();
}

Изменить:

При использовании темы AppCompat в диалоговом окне отображается круглый ползунок, который невозможно настроить. Однако вы можете указать диалоговому окну использовать более новую тему (что не будет проблемой, поскольку ваш minSdk равен 15):

final TimePickerDialog tpd = new TimePickerDialog(getActivity(),
        android.R.style.Theme_Holo_Light_Dialog, this, hour, minute,
        DateFormat.is24HourFormat(getActivity()));
person Simas    schedule 08.02.2015
comment
Ошибка Attempt to invoke virtual method 'android.view.View android.view.ViewGroup.getChildAt(int)' on a null object reference на ViewGroup layout = (ViewGroup) tpLayout.getChildAt(0); :( - person Slim; 09.02.2015
comment
@Slim, ты используешь тот же код, что и в моем ответе? Ваша ошибка может означать, что макет еще не раздут или отличается от того, который есть у моего TimePickerDialog. Подтвердите, какой именно, используя метод, который я опубликовал (с помощью Android Device Monitor). - person Simas; 09.02.2015
comment
@Slim выглядит так, как будто вы используете тему AppCompat, которая предоставляет другой TimePickerDialog. Какой API вы используете? - person Simas; 09.02.2015
comment
minSdkVersion: 15, targetSdkVersion: 21, compileSdkVersion: 21 на эмуляторе Lolipop - person Slim; 09.02.2015
comment
@Slim, тогда вам не нужно использовать тему AppCompat. В вашем файле styles.xml измените значение на <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> или эквивалентное. - person Simas; 09.02.2015
comment
@Slim то, что вы видите, это старый дизайн TimePicker. Он содержит круговой ползунок, который представляет собой единый вид и не настраивается. Вам лучше использовать новый TimePicker или создать свой собственный с нуля. - person Simas; 09.02.2015
comment
Давайте продолжим обсуждение в чате. - person Slim; 09.02.2015