TimePicker показывает только минуты и устанавливает максимальное количество минут, если пользователь вводит время с клавиатуры.

Вот так мой таймпикер выглядит на данный момент. Я хочу, чтобы он отображал только минуты, а минуты - только до максимума 30. Он работает нормально, но когда вы вводите время с клавиатуры, он устанавливает время на 0, но я хочу, чтобы оно дошло до максимума. поэтому, если пользователь вводит 50, он должен перейти к 30, как я могу это сделать? и как я могу скрыть час хронометража, потому что он здесь не нужен.

protected void onCreate(Bundle savedInstanceState) {
    System.out.println("Powernap");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.powernap);
    TimePicker pn = (TimePicker) findViewById(R.id.tp_powernap);

    pn.setOnTimeChangedListener(StartTimeChangedListener);
    pn.setIs24HourView(true);
}

    private TimePicker.OnTimeChangedListener StartTimeChangedListener =
        new TimePicker.OnTimeChangedListener() {

        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
            updateDisplay(view, hourOfDay, minute);          
        }
    };

    private TimePicker.OnTimeChangedListener NullTimeChangedListener =
        new TimePicker.OnTimeChangedListener() {

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

        }
    };

    private void updateDisplay(TimePicker timePicker, int hourOfDay, int minute) { 

        // do calculation of next time 
        int nextMinute = 0;
        int nextHour = 0;
        if (minute > 30){
            System.out.println("Minute+30");
            nextMinute = 30;
            // set minute
            timePicker.setCurrentMinute(nextMinute);
        }
        else {          
            System.out.println("minute 0");
            nextMinute = 0;
        }
        if (hourOfDay != 0){
            System.out.println("hour>0");
            nextHour = 24;
        }

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

        // set minute
        timePicker.setCurrentMinute(timePicker.getCurrentMinute()+nextMinute);

        //set hour
        timePicker.setCurrentHour(nextHour);

        // hook up ontimechangedlistener again
        timePicker.setOnTimeChangedListener(StartTimeChangedListener);

    }

person kirbby    schedule 21.01.2011    source источник


Ответы (2)


вот как я сделал часть с максимальным и минимальным шагом и 5-минутными шагами, в stackoverflow есть образцы, но с их методами вы не можете использовать кнопки вверх и вниз, с моим методом это работает:

public class Powernap extends Activity {



/** Called when the activity is first created. */
@Override
protected void onCreate(Bundle savedInstanceState) {
    System.out.println("Powernap");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.powernap);
    TimePicker pn = (TimePicker) findViewById(R.id.tp_powernap);
    pn.setCurrentMinute(5);
    System.out.println("timepicker erstellt");
    pn.setDescendantFocusability(TimePicker.FOCUS_BLOCK_DESCENDANTS);
    System.out.println("Tastatur geblockt");
    pn.setOnTimeChangedListener(StartTimeChangedListener);
    System.out.println("starttimechangedlistener");
    pn.setIs24HourView(true);
}


    private TimePicker.OnTimeChangedListener StartTimeChangedListener =
        new TimePicker.OnTimeChangedListener() {

        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
            updateDisplay(view, hourOfDay, minute);          
        }
    };

    private TimePicker.OnTimeChangedListener NullTimeChangedListener =
        new TimePicker.OnTimeChangedListener() {

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

        }
    };

    private void updateDisplay(TimePicker timePicker, int hourOfDay, int minute) { 

        // do calculation of next time 
        int nextMinute = 0;
        int nextHour = 0;
        if (minute >= 30 && minute <= 59){
            System.out.println("Minute+30");
            nextMinute = 30;
        }
        else if(minute == 26){
            System.out.println("Minute auf 30");
            nextMinute = 30;
        }
        else if(minute == 25 || minute == 21 || minute == 29){
            System.out.println("Minute auf 25");
            nextMinute = 25;
        }
        else if(minute == 20 || minute == 16 || minute == 24){
            System.out.println("Minute auf 20");
            nextMinute = 20;
        }
        else if(minute == 15 || minute == 11 || minute == 19){
            System.out.println("Minute auf 15");
            nextMinute = 15;
        }
        else if(minute == 10 || minute == 6 || minute == 14){
            System.out.println("Minute auf 10");
            nextMinute = 10;
        }
        else if(minute == 5 || minute == 1 || minute == 9 || minute < 5){
            System.out.println("Minute auf 5");
            nextMinute = 5;
        }





        if (hourOfDay != 0){
            System.out.println("hour>0");
            nextHour = 24;
        }

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

        // set minute
        timePicker.setCurrentMinute(nextMinute);

        //set hour
        timePicker.setCurrentHour(nextHour);

        // hook up ontimechangedlistener again
        timePicker.setOnTimeChangedListener(StartTimeChangedListener);

    }
person kirbby    schedule 01.02.2011

Вам нужно будет написать свой собственный виджет. То, что вы хотите, не поддерживается виджетом TimePicker или TimePickerDialog.

person CommonsWare    schedule 27.01.2011
comment
только чтобы скрыть час или также отображать только минуты до 30. Еще одна вещь, которую я хочу сделать, это отображать только 5,10,15,20,25 и 30 минут с помощью кнопки вверх и вниз. Я нашел решение сделать это только вверх или вниз, а другое не работает. - person kirbby; 31.01.2011
comment
@kirbby: Мой ответ остается в силе: вам придется написать свой собственный виджет. - person CommonsWare; 31.01.2011
comment
хорошо, я получил вещь с минутами от минимума 5 до максимума 30 с шагом 5 минут, не писал новый;) и я думаю, что проигнорирую часовую часть и оставлю ее там, потому что пользователь не может ввести что-то там . - person kirbby; 01.02.2011