Reputation: 208
I am using TimePicker(not TimePicker Dialog) in his spinner mode. I set initial data to time picker and I use OnTimeChangedListener to catch and update changed data.
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
}
});
But the problem is that OnTimeChangedListener triggers not only when user makes any changes, but also when orientation change for example. So I wanted to know if this any possibility to detect only changes happend in the result of touching TimePiker?
Edited:
@Override
protected void onCreate(@Nullable final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.new_alarm_activity);
ButterKnife.bind(this);
initListeners();
Intent intent = getIntent();
String action = intent.getAction();
if (action != null && action.equals(CHANGE_EXIST_ALARM)) {
//1. changing exist alarm
//here it is not
String extra = intent.getStringExtra(INTENT_STRING);
DBManager.getInstance().getAlarmByString(extra, new DBManager.onDataUpdated() {
@Override
public void onDataReceived(Alarm alarm) {
if (savedInstanceState != null) {
mAlarm = (Alarm) savedInstanceState.get(EXTRA_ALARM_OBJECT);
setInitialUI(mAlarm);
} else {
mAlarm = alarm;
setDetails(mAlarm);
setInitialUI(mAlarm);
}
}
});
} else if (savedInstanceState != null) {
//2. after orientation change alarm exist
//here it works
Alarm alarm = (Alarm) savedInstanceState.get(EXTRA_ALARM_OBJECT);
if (alarm != null) {
mAlarm = alarm;
setInitialUI(mAlarm);
} else {
//3. after orientation change alarm not exist
mAlarm = new Alarm();
setInitialDataToLocalAlarm();
setInitialUI(null);
}
isDialogShown = savedInstanceState.getBoolean(Constants.IS_DIALOG_SHOWN, false);
if (isDialogShown) {
showDialog();
}
isDatePickerShown = savedInstanceState.getBoolean(Constants.IS_DATE_PICKER_SHOWN, false);
if (isDatePickerShown) {
showDatePicker();
}
} else {
//here it works
//4. before orientation change
mAlarm = new Alarm();
setInitialDataToLocalAlarm();
setInitialUI(null);
}
}
I tried to add this to initListener method in On Create or to here
@Override
protected void onResume() {
super.onResume();
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
//use getFocusedChild() helps partly
if (view.getFocusedChild() != null) {
logIt(" time is " + hourOfDay + ":" + minute);
mAlarm.setHour(hourOfDay);
mAlarm.setMinute(minute);
Calendar initialCalendar = Calendar.getInstance();
initialCalendar.set(Calendar.YEAR, mAlarm.getAlarmYear());
initialCalendar.set(Calendar.MONTH, mAlarm.getAlarmMonth() - 1);
initialCalendar.set(Calendar.DAY_OF_MONTH, mAlarm.getAlarmDay());
initialCalendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
initialCalendar.set(Calendar.MINUTE, minute);
initialCalendar.set(Calendar.SECOND, 0);
mAlarm.setChosenDay(initialCalendar.getTimeInMillis());
formateTimeInMilliss(mAlarm.getChosenDay());
}
}
});
}
private void setDetails(Alarm alarm) {
mAlarm.setIs_on(alarm.isIs_on());
mAlarm.setAlarm_name(alarm.getAlarm_name());
mAlarm.setAlarmYear(alarm.getAlarmYear());
mAlarm.setAlarmMonth(alarm.getAlarmMonth());
mAlarm.setAlarmDay(alarm.getAlarmDay());
mAlarm.setAlarmDayOfWeek(alarm.getAlarmDayOfWeek());
mAlarm.setSoundName(alarm.getSoundName());
mAlarm.setSoundUri(alarm.getSoundUri());
mAlarm.setIs_sound_chosen(alarm.isIs_sound_chosen());
mAlarm.setVibrationName(alarm.getVibrationName());
mAlarm.setVibrationApmlitude(alarm.getVibrationApmlitude());
mAlarm.setVibrationAPattern(alarm.getVibrationAPattern());
mAlarm.setIs_vibro_chosen(alarm.isIs_vibro_chosen());
mAlarm.setChosenDay(alarm.getChosenDay());
mAlarm.setHour(alarm.getHour());
mAlarm.setMinute(alarm.getMinute());
mAlarm.setChosenDay(alarm.getChosenDay());
}
private void initetimePicker(int hour, int minute) {
timePicker.setHour(hour);
timePicker.setMinute(minute);
mAlarm.setHour(hour);
mAlarm.setMinute(minute);
logIt("hour " + mAlarm.getHour() + " minute " + mAlarm.getMinute());
}
private void setInitialUI(Alarm alarm) {
soundUIChecksFull();
vibroUIChecksFull();
textViewAlarmName.setText(mAlarm.getAlarm_name());
textViewAlarmDays.setText(getDateString());
if (alarm == null) {
initetimePicker(6, 0);
} else {
timePicker.setHour(alarm.getHour());
timePicker.setMinute(alarm.getMinute());
logIt("hour " + alarm.getHour() + " minute " + alarm.getMinute());
}
}
public void setInitialDataToLocalAlarm() {
Calendar initialCalendar = Calendar.getInstance();
Calendar alarmCalendar = Calendar.getInstance();
Calendar todaysCalendar = Calendar.getInstance();
int year = initialCalendar.get(Calendar.YEAR);
int month = initialCalendar.get(Calendar.MONTH);
int day = initialCalendar.get(Calendar.DAY_OF_MONTH);
int dayOfWeek = initialCalendar.get(Calendar.DAY_OF_WEEK);
alarmCalendar.set(year, month, day, 6, 0, 0);
todaysCalendar.setTimeInMillis(System.currentTimeMillis());
if (todaysCalendar.get(Calendar.HOUR_OF_DAY) < 6) {
alarmCalendar.set(year, month, day, 6, 0, 0);
mAlarm.setAlarmDayOfWeek(dayOfWeek);
} else {
day = day + 1;
alarmCalendar.set(year, month, day + 1, 6, 0, 0);
dayOfWeek = dayOfWeek + 1;
mAlarm.setAlarmDayOfWeek(dayOfWeek);
}
mAlarm.setChosenDay(alarmCalendar.getTimeInMillis());
//initetimePicker(6, 0);
Sound defaultSound = getDefaultSound();
String fullSoundURI = defaultSound.getSoundUri() + "/" + defaultSound.getSoundId();
Vibration defaultVibro = getDefaultVibro();
String amplitude = Arrays.toString(defaultVibro.getAmplitudes());
String pattern = Arrays.toString(defaultVibro.getVibratePatterns());
mAlarm.setIs_on(true);
mAlarm.setAlarm_name(getString(R.string.none));
mAlarm.setAlarmYear(year);
mAlarm.setAlarmMonth(month + 1);
mAlarm.setAlarmDay(day);
mAlarm.setAlarmDayOfWeek(dayOfWeek);
mAlarm.setSoundName(defaultSound.getSoundTitle());
mAlarm.setSoundUri(fullSoundURI);
mAlarm.setIs_sound_chosen(true);
mAlarm.setVibrationName(defaultVibro.getVibrationName());
mAlarm.setVibrationApmlitude(amplitude);
mAlarm.setVibrationAPattern(pattern);
mAlarm.setIs_vibro_chosen(true);
}
Upvotes: 0
Views: 1833
Reputation: 3043
Make sure that you set your listener after setting initial data. If you set hour/minute after listener, listener will be notified which is normal.
timePicker.setHour(5);
timePicker.setMinute(44); //set initial data BEFORE
timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
Toast.makeText(EspressoTestActivity.this, ""+hourOfDay+" : " +minute, Toast.LENGTH_LONG ).show();
}
});
//if you set hour/minute here then it is normal that listener is notified
Upvotes: 0