使用时间选择器对话框设置倒数计时器 android

Setting a countdown timer with time picker dialog android

我的最终目标是使用 android 中的时间选择器对话框设置倒数计时器。到目前为止,我有一个可以设置为任何时间的时间选择器,还有一个倒数计时器。所以我的问题是如何将倒数计时器中的 textview 设置为我的时间选择器中设置的内容。在我的代码中,我只是将倒数计时器设置为三分钟,但我希望将其设置为时间选择器对话框设置的时间。

这是我的...

public class SleepTimer extends AppCompatActivity {
TimePicker myTimePicker;
Button buttonstartSetDialog;
TextView textAlarmPrompt;
TimePickerDialog timePickerDialog;
final static int RQS_1 = 1;
Button btnStart, btnStop;
TextView textViewTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sleep_timer);

    btnStart = (Button)findViewById(R.id.btnStart);
    btnStop= (Button)findViewById(R.id.btnStop);
    textViewTime = (TextView)findViewById(R.id.textViewTime);



    final CounterClass timer = new CounterClass(180000, 1000);

    btnStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            timer.start();
        }
    });
    btnStop.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {
            timer.cancel();
        }
    });

    textAlarmPrompt = (TextView)findViewById(R.id.alarmprompt);
    buttonstartSetDialog = (Button)findViewById(R.id.startSetDialog);
    buttonstartSetDialog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textAlarmPrompt.setText("");
            openTimePickerDialog(false);
        }
    });


}

private void openTimePickerDialog(boolean is24r){
    Calendar calendar = Calendar.getInstance();

    timePickerDialog = new TimePickerDialog(
            SleepTimer.this,
            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) {

        Calendar calNow = Calendar.getInstance();
        Calendar calSet = (Calendar) calNow.clone();

        calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
        calSet.set(Calendar.MINUTE, minute);
        calSet.set(Calendar.SECOND, 0);
        calSet.set(Calendar.MILLISECOND, 0);

        if(calSet.compareTo(calNow) <= 0){

            calSet.add(Calendar.DATE, 1);
        }

        setAlarm(calSet);

    }};


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() {

    }
}

如果有人知道如何执行此操作,请回复。谢谢:)

首先改变这个方法,让它看起来像这样

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

    }};

然后移除final CounterClass timer = new CounterClass(180000, 1000) 并将其添加为字段而不是

CounterClass timer;

此代码设置 TextView 并使用所选时间更新您的计数器。但是我重用了你的代码,现在我们重复了相同的代码,这不好。将它提取到一个方法中,这样我们就不会重复自己。

复制粘贴版

public class SleepTimer extends AppCompatActivity {
TimePicker myTimePicker;
Button buttonstartSetDialog;
TextView textAlarmPrompt;
TimePickerDialog timePickerDialog;
final static int RQS_1 = 1;
Button btnStart, btnStop;
TextView textViewTime;
CounterClass timer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sleep_timer);

    btnStart = (Button) findViewById(R.id.btnStart);
    btnStop = (Button) findViewById(R.id.btnStop);
    textViewTime = (TextView) findViewById(R.id.textViewTime);




    btnStart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            timer.start();
        }
    });
    btnStop.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View v) {
            timer.cancel();
        }
    });

    textAlarmPrompt = (TextView) findViewById(R.id.alarmprompt);
    buttonstartSetDialog = (Button) findViewById(R.id.startSetDialog);
    buttonstartSetDialog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textAlarmPrompt.setText("");
            openTimePickerDialog(false);
        }
    });


}

private void openTimePickerDialog(boolean is24r) {
    Calendar calendar = Calendar.getInstance();

    timePickerDialog = new TimePickerDialog(
            SleepTimer.this,
            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);

}};


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() {

    }
}