我正在片段中使用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();
}
}
答案 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;
}
});