取消 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 上使用时间选择器,这样您就可以从您的子片段中启动和停止它。只需定义您自己的 startstoppause 方法。然后你可以用这种方式从你的任何片段中调用它

((YourActivity)getActivity()).yourMethodName();

在 activity 中声明您的计时器。

class MyClass extends AppCompatActivity {
**STUFF**
public CountDownTimer timer;
}

然后这样开始和停止

((MyClass)getActivity()).timer.start();
((MyClass)getActivity()).timer.cancel();