Ошибка Stackoverflow в Timepicker в Android?

#android #android-dialogfragment #android-timepicker

#Android #android-dialogfragment #android-timepicker

Вопрос:

я использую средство выбора времени через фрагмент диалогового окна.В этом сборщике времени я установил минимальное и максимальное время. я получил ошибку переполнения стека, когда я нажимаю минус (теперь время в минимальном значении в минутах) кнопка минут в сборщике времени в API 10, но в API 15 она работает fine.am не удалось получить решение для этогопроблема.Может ли кто-нибудь помочь мне решить эту проблему.

Класс фрагмента диалогового окна выбора времени

 package data.picker;

import java.text.DateFormat;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.widget.TimePicker;

public class Time_picker extends DialogFragment{

OnTimeSetListener ontimeSet;

int minHour;
int minMinute;

private int maxHour = 24;
private int maxMinute =00;
DateFormat dateFormat;
public Time_picker() {

}

public void setCallBack(OnTimeSetListener ontime) {

    ontimeSet = ontime;

}

private int hours, minutes;
@Override
public void setArguments(Bundle args) {
    super.setArguments(args);
    hours = args.getInt("hours");
    minutes = args.getInt("minute");

    minHour = hours;
    minMinute = minutes;
}

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    TimePickerDialog _time = new TimePickerDialog(getActivity(), ontimeSet, hours, minutes,false){

        @Override
        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
            // TODO Auto-generated method stub

            try{
                boolean validTime;
                if(hourOfDay < minHour) {
                    validTime = false;
                }
                else if(hourOfDay == minHour) {
                    validTime = minute >= minMinute;
                }
                else if(hourOfDay == maxHour) {
                    validTime = minute <= maxMinute;
                }
                else {
                    validTime = true;
                }

                if(validTime) {
                    hours = hourOfDay;
                    minutes = minute;
                }
                else {
                    updateTime(hours, minutes);
                }

            }catch(Exception e){

            }
        }
    };
    return _time;
}
}
  

Ошибка журнала-cat

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

Ответ №1:

Вы звоните updateTime(hours, minutes); с onTimeChanged какого момента validTime==false . Это основная причина вашего бесконечного цикла. Я не знаю, почему это работает в API 15 (возможно, вы никогда не достигнете этой строки в API 15)


Попробуйте что-то вроде этого.

 @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

    TimePickerDialog _time = new TimePickerDialog(getActivity(), ontimeSet, hours, minutes,false){
        private boolean ignoreChange = false;

        @Override
        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
            if(ignoreChange) return;
            try{
                boolean validTime;
                if(hourOfDay < minHour) {
                    validTime = false;
                }
                else if(hourOfDay == minHour) {
                    validTime = minute >= minMinute;
                }
                else if(hourOfDay == maxHour) {
                    validTime = minute <= maxMinute;
                }
                else {
                    validTime = true;
                }

                if(validTime) {
                    hours = hourOfDay;
                    minutes = minute;
                }
                else {
                    try{
                        ignoreChange = true;
                        updateTime(hours, minutes);
                    }finally{
                        ignoreChange = false;
                    }
                }

            }catch(Exception e){
                Log.e(TAG,"Error onTimeChanged",e);
            }
        }
    };
    return _time;
}
  

Комментарии:

1. как я могу использовать это условие для обновления средства выбора времени.