Хронометр сбрасывается при изменении конфигурации приложения в Android

#java #android #android-viewmodel #chronometer

#java #Android #android-viewmodel #хронометр

Вопрос:

Я создал приложение для секундомера с использованием Chronometer и ViewModel приложение работает хорошо до изменения конфигурации. при повороте экрана секундомер сбрасывается 00:00 .

это часть StopwatchTabFrag.java .

 stopwatchTabViewModel.buttonIcon.observe(getViewLifecycleOwner(), new Observer<Integer>() {
            @Override
            public void onChanged(Integer imgId) {

                switch (imgId){
                    //when the icon is changed to pause (or) when user clicks play icon then Stopwatch is start.
                    case R.drawable.ic_round_pause_circle_filled_24:
                        binding.stop.setVisibility(View.VISIBLE);
                        binding.startPause.setImageResource(imgId);
                        stopwatchTabViewModel.startStopwatch(stopwatchChronometer);
                        break;
                    //when the icon is changed to start (or) when user clicks pause icon then Stopwatch is pause.
                    case R.drawable.ic_round_play_arrow_24:
                        binding.startPause.setImageResource(imgId);
                        stopwatchTabViewModel.pauseStopwatch(stopwatchChronometer);
                        break;
                    case R.drawable.ic_round_stop_24:
                        binding.stop.setVisibility(View.GONE);
                        stopwatchTabViewModel.stopStopwatch(stopwatchChronometer);
                }
            }
        });

  

Я использую Observer всякий раз, когда меняется значок конкретной кнопки, он выполняет эту конкретную задачу.

это часть StopwatchTabViewModel.java .

 public void startStopwatch(Chronometer chronometer){
        if (!isRunning.getValue()){
            chronometer.setBase(SystemClock.elapsedRealtime()-pauseOfset.getValue());
            chronometer.start();
            _isRunning.setValue(true);
        }
    }

    public void pauseStopwatch(Chronometer chronometer){
        if (isRunning.getValue()){
            chronometer.stop();
            _pauseOfset.setValue(SystemClock.elapsedRealtime()-chronometer.getBase());
            _isRunning.setValue(false);
        }
    }

    public void stopStopwatch(Chronometer chronometer){
        chronometer.setBase(SystemClock.elapsedRealtime());
        _pauseOfset.setValue(0L);
        chronometer.stop();

        //Reset the icon to Start
        _buttonIcon.setValue(R.drawable.ic_round_play_arrow_24);
    }

  

Я реализовал методы задачи секундомера в ViewModel классе. Я не знаю, правильно это или неправильно.

Я жду ваших ответов.

Ответ №1:

добавьте эту строку в объявление Activity s в манифесте:

 android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
  

это предотвратит Activity уничтожение при вращении (следовательно, и вашего хронометра), вам придется самостоятельно обрабатывать вращение при onConfigurationChanged вызове метода (вам, вероятно, ничего не нужно будет делать в вашем случае)

ЗДЕСЬ у вас есть некоторая информация об изменении конфигурации.