当前位置: 首页 > 知识库问答 >
问题:

倒计时问题Android

牟稳
2023-03-14

我的应用程序检查是否有一个带有日期的文件。

如果有日期,它将计算今天和该(未来)日期之间的差值,并初始化计时器,以X天Y小时Z分S秒的方式倒计时到该日期。

如果没有文件,则用户可以通过按钮选择日期。程序将在文件中存储日期并设置倒计时。

有一个删除按钮可以删除日期并选择其他日期。此删除按钮应取消计时器,使其停止计数。

当我取消计时器时,计时器不会停止。我的计时器滴答作响,但相差2秒,而不是1秒。显示40 38 36...而不是40 39 38...

最后,它将选择的日期存储两次而不是一次。

日期选择器代码来自这里。

public class NextVisit extends Activity implements DatePickerFragment.TheListener{
protected Vibrator vibrate;
protected int SECONDS_IN_A_DAY = 24 * 60 * 60;
protected String filePath = "";
protected SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
final long[] pattern = {0, 1000, 500, 1000, 500, 1000, 500, 1000 };
CountDownTimer timer = null;
String dateString = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_next_visit);
    final TextView label = (TextView) findViewById(R.id.label);
    final TextView countdown = (TextView) findViewById(R.id.time_visit);
    final Button bDate = (Button) findViewById(R.id.date_button);
    final Button bDelete = (Button) findViewById(R.id.delete_button);
    File dir = new File(getFilesDir(), "loveApp");
    if(!dir.exists())
        dir.mkdirs();
    final File f =  new File(getFilesDir()+"/loveApp"+"/love_date.txt");
    filePath = f.getAbsolutePath();
    vibrate = (Vibrator) getSystemService(VIBRATOR_SERVICE);
    bDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(f.exists()){
                f.delete();
                System.out.println("File deleted successfully");
                bDate.setVisibility(View.VISIBLE);
                label.setText(R.string.next_visit1);
                timer.cancel();
                countdown.setText("");
                System.out.println("I cancelled the timer");

                bDelete.setVisibility(View.INVISIBLE);
                bDate.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        DialogFragment picker = new DatePickerFragment();
                        bDelete.setVisibility(View.VISIBLE);
                        bDate.setVisibility(View.INVISIBLE);
                        picker.show(getFragmentManager(), "datePicker");
                    }
                });

            }
        }
    });

    if(f.exists()){
        System.out.println("File exists");
        bDate.setVisibility(View.INVISIBLE);
        label.setText(getString(R.string.label));
        try{
            BufferedReader br = new BufferedReader(new FileReader(f));
            dateString = br.readLine();
            br.close();
            System.out.println("Date: "+dateString);
            Date finalDate = formatter.parse(dateString);
            setCountdown(finalDate);
        }catch(Exception e){
            e.printStackTrace();
            label.setText("ERROR");
        }

    }else{
        System.out.println("File DOES NOT EXIST");
        bDelete.setVisibility(View.INVISIBLE); //Removing the delete date button
        bDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                DialogFragment picker = new DatePickerFragment();
                bDelete.setVisibility(View.VISIBLE);
                bDate.setVisibility(View.INVISIBLE);
                picker.show(getFragmentManager(), "datePicker");
            }
        });
 }
}
public void setCountdown(Date finishDate){
    long end = finishDate.getTime();
    final TextView countdown = (TextView)  findViewById(R.id.time_visit);
    timer = new CountDownTimer(end, 1000){
        @Override
        public void onTick(long millisUntilFinished) {
            long now = Calendar.getInstance(Locale.GERMANY).getTimeInMillis()+1000;
            long diff =  millisUntilFinished - now;
            long diffSec = diff / 1000;

            long days = diffSec / SECONDS_IN_A_DAY;
            long secondsDay = diffSec % SECONDS_IN_A_DAY;
            long seconds = secondsDay % 60;
            long minutes = (secondsDay / 60) % 60;
            long hours = (secondsDay / 3600);
            countdown.setText(days+ " days, "+ hours + "hours, "+minutes + "m, "+seconds + "s remaining!");
        }

        @Override
        public void onFinish() {
            countdown.setText("done!");
            vibrate.vibrate(pattern,-1);
        }
    }.start();


}


@Override
public void returnDate(String date) {
    dateString = date;
    TextView label = (TextView) findViewById(R.id.label);
    label.setText(R.string.label);
    BufferedWriter bw;
    try {
        bw = new BufferedWriter(new FileWriter(new File(filePath)));
        bw.write(dateString);
        bw.close();
        System.out.println("Saved the file, date is: "+ dateString);
        Date finishDate = formatter.parse(date);
        setCountdown(finishDate);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
}

共有1个答案

常雅珺
2023-03-14

我认为这个字符串中的问题long now=Calendar.get实例(区域设置。GERMANY). getTimeInMillis()1000;你需要把它放在Countdown定时器代码之外。

final long now = Calendar.getInstance(Locale.GERMANY).getTimeInMillis()+1000;
timer = new CountDownTimer(end, 1000){
        @Override
        public void onTick(long millisUntilFinished) {
            long diff =  millisUntilFinished - now;
            long diffSec = diff / 1000;
...
};
 类似资料:
  • timeLabel应该从60倒数到0,但我还没有实现一个持续时间。例如这样它就像一个真正的倒数计时器。我该怎么做。另一个问题是运行此代码时游戏不会在模拟器中启动。我得到一个错误,我被重定向到AppDelegate.swift文件:

  • 本文向大家介绍IOS倒计时设置UIButton标题title的抖动问题,包括了IOS倒计时设置UIButton标题title的抖动问题的使用技巧和注意事项,需要的朋友参考一下 例如,在发送验证码后,button状态需要变为disable,每隔一秒显示倒计时时间,仅仅设置 或 是不够的,按钮会一闪一闪的抖动。 需要同时设置: 或 以上所述是小编给大家介绍的IOS倒计时设置UIButton标题titl

  • 介绍 用于实时展示倒计时数值,支持毫秒精度。 引入 import { createApp } from 'vue'; import { CountDown } from 'vant'; const app = createApp(); app.use(CountDown); 代码演示 基础用法 time 属性表示倒计时总时长,单位为毫秒。 <van-count-down :time="time

  • CountDown 倒计时 平台差异说明 App H5 微信小程序 支付宝小程序 百度小程序 头条小程序 QQ小程序 √ √ √ √ √ √ √ 基本使用 通过timestamp参数设置倒计时间,单位为秒 <template> <u-count-down :timestamp="timestamp"></u-count-down> </template> <script> export de

  • 问题内容: 我想知道是否有人可以帮助我。经过数小时的不懈搜索,在这里和网上我似乎找不到使用jquery的简单倒计时。我不想使用任何类型的插件,而只是简单的jquery代码来从日期倒数。我设法在下面找到此代码。但是即使将此代码放置在我的网站中,也不会显示任何内容。我从jquery.com添加了jquery文件,并添加了ID不包含任何内容的正确div 。如果有人可以解释或告诉我如何在采用日期格式并返回

  • 本文向大家介绍基于Android实现答题倒计时功能,包括了基于Android实现答题倒计时功能的使用技巧和注意事项,需要的朋友参考一下 讲一下我在做一个答题APP时涉及到倒计时时遇到的一个问题吧。 碎片(Fragment)+CountDownTimer组成的一个答题,其中遇到的一个问题就是,这个题的倒计时在你手动滑动下一个题的时候却用在了下一个题的时间 解决这个问题运用的就是懒加载来控制倒计时的开