取消 CountDownTimer Android Java
Cancel A CountDownTimer Android Java
我在时间选择器对话框中有一个倒数计时器。我的 class 扩展片段
三页浏览量。
当我处于情况 0 并且 select 通过时间选择器 CountdownTimer 时,一切都很完美。当我处于情况 1 并且我想取消我的时间时,当我单击一个按钮时没有任何反应。
只有当我在 case 0 时才这样开始我的时间 timer.start();当我点击 timer.cancel() 时它起作用了;我希望有人能帮助我。
我的片段
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private CountDownTimer timer;
public PlaceholderFragment() {
}
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
//TextView textView = (TextView) rootView.findViewById(R.id.section_label);
//textView.setText(getArguments().getInt(ARG_SECTION_NUMBER));
//togglebutton.setChecked(false);
text1=(TextView) rootView.findViewById(R.id.textView1);
//textAlarmPrompt = (TextView) rootView.findViewById(R.id.textView1);
textViewTime = (TextView) rootView.findViewById(R.id.textView1);
buttonstartSetDialog = (Button) rootView.findViewById(R.id.btn1);
buttonstartSetDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//textAlarmPrompt.setText("");
openTimePickerDialog(true);
}
});
switch (getArguments().getInt(ARG_SECTION_NUMBER)) {
case 0: {
ImageView im = (ImageView) rootView.findViewById(R.id.im);
im.setBackgroundResource(R.drawable.thunder1);
ttsButton = (ToggleButton) rootView.findViewById(R.id.btn);
ttsButton.setChecked(true);
break;
}
case 1: {
ImageView im = (ImageView) rootView.findViewById(R.id.im);
im.setBackgroundResource(R.drawable.thunder2);
ttsButton = (ToggleButton) rootView.findViewById(R.id.btn);
ttsButton.setChecked(true);
break;
}
case 2: {
ImageView im = (ImageView) rootView.findViewById(R.id.im);
im.setBackgroundResource(R.drawable.thunder3);
ttsButton = (ToggleButton) rootView.findViewById(R.id.btn);
ttsButton.setChecked(true);
break;
}
}
return rootView;
}
我的时间选择器对话框
private void openTimePickerDialog(boolean is24r) {
Calendar calendar = Calendar.getInstance();
timePickerDialog = new TimePickerDialog(
getActivity(),
onTimeSetListener,
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
is24r);
timePickerDialog.setTitle("Set Sleep Time");
timePickerDialog.show();
}
TimePickerDialog.OnTimeSetListener onTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
timer = new CounterClass((minute * 60 * 1000) + (hourOfDay * 60* 60 * 1000), 1000);
long millis = (minute * 60 * 1000) + (hourOfDay * 60* 60 * 1000);
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
//System.out.println(hms);
textViewTime.setText(hms);
timer.start();
}};
public class CounterClass extends CountDownTimer {
/**
* @param millisInFuture The number of millis in the future from the call
* to {@link #start()} until the countdown is done and {@link #onFinish()}
* is called.
* @param countDownInterval The interval along the way to receive
* {@link #onTick(long)} callbacks.
*/
public CounterClass(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@Override
public void onTick(long millisUntilFinished) {
long millis = millisUntilFinished;
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
//System.out.println(hms);
textViewTime.setText(hms);
@Override
public void onFinish() {
System.exit(0);
}
}
我尝试在单击按钮时停止它
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (this.isVisible()) {
btnstop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(timer != null)
timer.cancel();
}
});
}
}
我建议您在 activity 上使用时间选择器,这样您就可以从您的子片段中启动和停止它。只需定义您自己的 start、stop、pause 方法。然后你可以用这种方式从你的任何片段中调用它
((YourActivity)getActivity()).yourMethodName();
在 activity 中声明您的计时器。
class MyClass extends AppCompatActivity {
**STUFF**
public CountDownTimer timer;
}
然后这样开始和停止
((MyClass)getActivity()).timer.start();
((MyClass)getActivity()).timer.cancel();
我在时间选择器对话框中有一个倒数计时器。我的 class 扩展片段 三页浏览量。
当我处于情况 0 并且 select 通过时间选择器 CountdownTimer 时,一切都很完美。当我处于情况 1 并且我想取消我的时间时,当我单击一个按钮时没有任何反应。
只有当我在 case 0 时才这样开始我的时间 timer.start();当我点击 timer.cancel() 时它起作用了;我希望有人能帮助我。
我的片段
public static class PlaceholderFragment extends Fragment {
/**
* The fragment argument representing the section number for this
* fragment.
*/
private CountDownTimer timer;
public PlaceholderFragment() {
}
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
//TextView textView = (TextView) rootView.findViewById(R.id.section_label);
//textView.setText(getArguments().getInt(ARG_SECTION_NUMBER));
//togglebutton.setChecked(false);
text1=(TextView) rootView.findViewById(R.id.textView1);
//textAlarmPrompt = (TextView) rootView.findViewById(R.id.textView1);
textViewTime = (TextView) rootView.findViewById(R.id.textView1);
buttonstartSetDialog = (Button) rootView.findViewById(R.id.btn1);
buttonstartSetDialog.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//textAlarmPrompt.setText("");
openTimePickerDialog(true);
}
});
switch (getArguments().getInt(ARG_SECTION_NUMBER)) {
case 0: {
ImageView im = (ImageView) rootView.findViewById(R.id.im);
im.setBackgroundResource(R.drawable.thunder1);
ttsButton = (ToggleButton) rootView.findViewById(R.id.btn);
ttsButton.setChecked(true);
break;
}
case 1: {
ImageView im = (ImageView) rootView.findViewById(R.id.im);
im.setBackgroundResource(R.drawable.thunder2);
ttsButton = (ToggleButton) rootView.findViewById(R.id.btn);
ttsButton.setChecked(true);
break;
}
case 2: {
ImageView im = (ImageView) rootView.findViewById(R.id.im);
im.setBackgroundResource(R.drawable.thunder3);
ttsButton = (ToggleButton) rootView.findViewById(R.id.btn);
ttsButton.setChecked(true);
break;
}
}
return rootView;
}
我的时间选择器对话框
private void openTimePickerDialog(boolean is24r) {
Calendar calendar = Calendar.getInstance();
timePickerDialog = new TimePickerDialog(
getActivity(),
onTimeSetListener,
calendar.get(Calendar.HOUR_OF_DAY),
calendar.get(Calendar.MINUTE),
is24r);
timePickerDialog.setTitle("Set Sleep Time");
timePickerDialog.show();
}
TimePickerDialog.OnTimeSetListener onTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
timer = new CounterClass((minute * 60 * 1000) + (hourOfDay * 60* 60 * 1000), 1000);
long millis = (minute * 60 * 1000) + (hourOfDay * 60* 60 * 1000);
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
//System.out.println(hms);
textViewTime.setText(hms);
timer.start();
}};
public class CounterClass extends CountDownTimer {
/**
* @param millisInFuture The number of millis in the future from the call
* to {@link #start()} until the countdown is done and {@link #onFinish()}
* is called.
* @param countDownInterval The interval along the way to receive
* {@link #onTick(long)} callbacks.
*/
public CounterClass(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@TargetApi(Build.VERSION_CODES.GINGERBREAD)
@Override
public void onTick(long millisUntilFinished) {
long millis = millisUntilFinished;
String hms = String.format("%02d:%02d:%02d", TimeUnit.MILLISECONDS.toHours(millis), TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millis)));
//System.out.println(hms);
textViewTime.setText(hms);
@Override
public void onFinish() {
System.exit(0);
}
}
我尝试在单击按钮时停止它
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (this.isVisible()) {
btnstop.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if(timer != null)
timer.cancel();
}
});
}
}
我建议您在 activity 上使用时间选择器,这样您就可以从您的子片段中启动和停止它。只需定义您自己的 start、stop、pause 方法。然后你可以用这种方式从你的任何片段中调用它
((YourActivity)getActivity()).yourMethodName();
在 activity 中声明您的计时器。
class MyClass extends AppCompatActivity {
**STUFF**
public CountDownTimer timer;
}
然后这样开始和停止
((MyClass)getActivity()).timer.start();
((MyClass)getActivity()).timer.cancel();