1

アプリで小さなカウントダウン タイマーを作成しようとしていますが、機能していません。

アイデアは、特定の時間までカウントダウンすることです。最初は日単位で、近づくと時間単位で。

次のメソッドは Fragmentclass.java 内にあります (したがって、フラグメントです)

@Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onViewCreated(view, savedInstanceState);


        Calendar cal = Calendar.getInstance();
        cal.set(2012, 8, 29, 10, 0);
        long endTime = cal.getTimeInMillis(); 
        long currentTime = System.currentTimeMillis();
        long remaining = currentTime - endTime;                 
        long seconds = remaining / 1000 % 60;               

         new CountDownTimer(seconds, 1000) {
             TextView tv = (TextView)getActivity().findViewById(R.id.introTimeLeft);
             public void onTick(long millisUntilFinished) {

                 Calendar cal = Calendar.getInstance();
                 cal.set(2012, 8, 29, 10, 0);
                long endTime = cal.getTimeInMillis(); 
                long currentTime = System.currentTimeMillis();
                long remaining = currentTime - endTime;                 
                long hours = remaining / 3600000;
                long mins = remaining / 60000 % 60;
                long seconds = remaining / 1000 % 60;
                long days = hours / 24;
                String remainingText = String.valueOf(days) + " days";

                Log.i("countdown",String.valueOf(days));
                 tv.setText("Days left: " + days);
             }

             public void onFinish() {
                 Log.i("countdown","CD Finished");
                 tv.setText("CD Finished!");
             }
          }.start();
    }

テキストボックスの値は現在テスト用ですが、カウントダウンを表示できないようです。

また、これは最善のアプローチですか?

4

1 に答える 1

2

コードを実行した場合の変数の値は次のとおりです。

endTime     = 1348902045437
currentTime = 1340645325437
remaining   = -8256720000
seconds     = 0

ご覧のとおりseconds == 0、これが理由です。

CountDownTimer(long millisInFuture, long countDownInterval) また、コンストラクターの最初の引数は

start() の呼び出しから、カウントダウンが完了して onFinish() が呼び出されるまでの将来のミリ秒数。

したがって、固定コードは次のようになります。

Calendar cal = Calendar.getInstance();
cal.set(2012, 8, 29, 10, 0);
long endTime = cal.getTimeInMillis(); 
long currentTime = System.currentTimeMillis();
long remaining = endTime - currentTime;

new CountDownTimer(remaining, 1000) {
...

アップデート:

テキストビューを更新しないのは奇妙です。私が提案できる唯一のアイデアは、メイン UI スレッドで更新呼び出しを実行することです。次のようになります。

public void onTick(long millisUntilFinished) {
    final String days = .. // some code to generate days
    getActivity().runOnUiThread(new Runnable() {
        public void run() {
            tv.setText("Days left: " + days);
        }
    });
}

public void onFinish() {
    Log.i("countdown","CD Finished");
    getActivity().runOnUiThread(new Runnable() {
        public void run() {
            tv.setText("CD Finished!");
        }
    });
}

これで解決しない場合は、アイデアがありません。

于 2012-06-25T17:30:30.087 に答える