TimePicker.OnTimeChangedListener()触发器不做任何更改

问题描述 投票:0回答:1

我在他的微调器模式下使用TimePicker(而不是TimePicker Dialog)。我将初始数据设置为时间选择器,并使用OnTimeChangedListener来捕获和更新已更改的数据。

timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
            @Override
            public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
            }
        });

但问题是OnTimeChangedListener不仅会在用户进行任何更改时触发,而且还会在方向更改时触发。所以我想知道是否有任何可能只检测触摸TimePiker的结果发生的变化?

编辑:

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

        }
    }

我尝试将此添加到On Create中的initListener方法或此处

 @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);
    }
android timepicker
1个回答
1
投票

确保在设置初始数据后设置监听器。如果您在侦听器后设置小时/分钟,将通知听众这是正常的。

    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 
© www.soinside.com 2019 - 2024. All rights reserved.