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