在物理后退按钮上取消CountDownTimer按下片段

时间:2018-10-03 15:37:00

标签: android android-fragments

我正在片段中使用CountDownTimer,并在用户按下电话中的物理后退按钮时尝试将其停止。我尝试覆盖onPauseonDestroyonStoponDestroyView,但似乎没有任何效果。有点失落在这里。有人可以给我指点吗?

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 :(得分:6)

这是我的2美分。片段没有Activity类中存在的onBackPressed()方法。当用户按下物理后退按钮时,它将被调用。这是文档所说的:

  

在活动检测到用户按下返回键时调用。默认实现只是完成当前活动,但是您可以覆盖此操作以执行所需的任何操作。

您可以做的是在onBackPressed()片段的父活动中覆盖Foo方法,然后使用一个接口与该片段通信,该片段是用户按下了后退按钮。在片段内,您可以具有所需的代码来取消计时器。问题This answer中的How to implement onBackPressed() in Fragments?可以帮助提供示例代码。

答案 1 :(得分:3)

尝试修改片段的父活动中的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();
}

答案 2 :(得分:3)

对于片段,您不能使用 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;
        }
    });
}

答案 3 :(得分:2)

您还必须调用countDownTime.finish()。我已经使用了它及其作品。

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

    if (countDownTimer != null)
    {
        countDownTimer.cancel();
        countDownTimer.onFinish();
    }
}

答案 4 :(得分:0)

您尝试过onBackPressed()

 @Override
    public void onBackPressed() {
            super.onBackPressed();
            myTimer.cancel();
            myTimer =null;
    }

答案 5 :(得分:0)

您是否尝试过像这样在片段中添加OnKeyListener: 这里的“视图”是片段的父布局,它是计时器的宿主。

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