Search code examples
androidandroid-dialogfragmentandroid-timepicker

Stackoverflow error in Timepicker in android?


am using time picker through dialog fragment.In that time picker am set the minimum and maximum time.i got the stack-overflow error when i click the minus(Now the time in minimum value in minutes) button minutes in time picker in API 10, but in API 15 its working fine.am not able to get the solution for this issue.Can any one know help me to solve this issue.

Time Picker dialog fragment Class

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

Log-cat error

enter image description here


Solution

  • You are calling updateTime(hours, minutes); from onTimeChanged when validTime==false. That's the root cause of your infinite loop. I don't know why it works on API 15 (probably that you never reach this line in API 15)


    Try something like this.

    @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;
    }