Отмена CountDownTimer при физическом нажатии кнопки «Назад» во фрагменте - PullRequest
0 голосов
/ 03 октября 2018

Я использую CountDownTimer во фрагменте и пытаюсь остановить его, если пользователь нажал физическую кнопку возврата в телефоне.Я попытался переопределить onPause, onDestroy, onStop, onDestroyView, но, похоже, ничего не работает.Вид здесь потерян.Кто-нибудь может дать мне указатель здесь?

public class Foo extends Fragment {

    CountDownTimer myTimer;

    @Override
    public void onStop() {
        super.onStop();
        myTimer.cancel();
    }

    @Override
    public void onPause() {
        super.onPause();
        myTimer.cancel();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        myTimer.cancel();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        myTimer.cancel();
    }

    @OnClick(R.id.btn_greenleft_no)
    public void goBack() {

        myTimer.cancel();
        Objects.requireNonNull(getActivity()).onBackPressed();
    }

    @OnClick(R.id.btn_greenright_yes)
    public void showSuccess(View view) {

        markAll();
        myTimer.cancel();
        (new MusicPlayer()).playSound(getContext(), "cheers.mp3");

        final Snackbar snackbar = Snackbar.make(snackBarView, R.string.congratulations, Snackbar.LENGTH_SHORT);

        snackbar.show();
        myTimer.cancel();


    }


    private void startTimer(final View view) {

        int Seconds = 5;

        myTimer = new CountDownTimer(Seconds * 1000 + 1000, 1000) {

            public void onTick(long millisUntilFinished) {

                String rem = String.valueOf(millisUntilFinished / 1000);
                    Log.d("APP_DEBUG", "Timer: " + rem);

            }

            public void onFinish() {
                goBack();
                }
        }.start();

    }

}

Ответы [ 6 ]

0 голосов
/ 11 октября 2018

Вы пытались добавить OnKeyListener в свой фрагмент следующим образом: Здесь "view" - это родительский макет вашего фрагмента, который содержит таймер.

view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.i(tag, "keyCode: " + keyCode);
            if( keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
               myTimer.cancel();
                return true;
            } 
            return false;
        }
    });
0 голосов
/ 09 октября 2018

Вы должны также вызвать countDownTime.finish ().Я использовал его и его работы для меня.

@Override
public void onDetach()
{
    super.onDetach();

    if (countDownTimer != null)
    {
        countDownTimer.cancel();
        countDownTimer.onFinish();
    }
}
0 голосов
/ 09 октября 2018

Для фрагмента вы не можете использовать метод onBackPressed . Вместо этого используйте этот код

 @Override
public void onResume() {
    super.onResume();
    if (getView() == null) {
        return;
    }
    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                myTimer.cancel();
                return false;
            }
            return true;
        }
    });
}
0 голосов
/ 08 октября 2018

Попробуйте изменить onBackPressed в родительской активности вашего фрагмента.

@Override
public void onBackPressed() {

    // I assume this is the way how You add fragment to fragment manager
    //getSupportFragmentManager().beginTransaction().replace(android.R.id.content, Foo.getInstance(), Foo.TAG).commit()

    // Find fragment by its string TAG and when You get it, call to stop countDownTimer
    Foo foo = (Foo) getSupportFragmentManager().findFragmentByTag(Foo.TAG);
    if (foo != null) {
        foo.stopCountDownTimer();
    }

    super.onBackPressed();
}

Следующий шаг - объявить в вашем фрагменте Foo две вещи:

public static final String TAG = "Foo";

и

public void stopCountDownTimer() {
    myTimer.cancel();
}
0 голосов
/ 08 октября 2018

Вот мои 2 цента.Фрагмент не имеет метода onBackPressed () , который присутствует в классе Activity.Он вызывается, когда пользователь нажимает физическую кнопку возврата.Вот что говорит документация:

Вызывается, когда активность обнаружила, что пользователь нажал клавишу возврата.Реализация по умолчанию просто завершает текущее действие, но вы можете переопределить это, чтобы сделать все, что вы хотите.

Что вы можете сделать, это переопределить метод onBackPressed() в родительском действии вашего фрагмента FooЗатем с помощью интерфейса связываются с фрагментом, чтобы кнопка возврата была нажата пользователем.Внутри фрагмента вы можете иметь нужный код для отмены таймера. Этот ответ в вопросе Как реализовать onBackPressed () во фрагментах? может помочь с примером кода.

0 голосов
/ 08 октября 2018

вы пробовали onBackPressed()

 @Override
    public void onBackPressed() {
            super.onBackPressed();
            myTimer.cancel();
            myTimer =null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...