1

学校に行く時間を教えてくれるアプリがあります ( :P )。テキスト Time: ( Hours to go ) を含むテキストビューがあります。これは 6.2 のはずですが、現時点では 6 です。[開始] をクリックすると、[学校はすぐに終了しました] と表示され、クラッシュします。ああ、このように時間を時間で表示したい ( 6.2 = 6 時間 20 分 )。何が問題なのですか?

コード開始アクティビティ:

package com.nieeli.timer;

import android.app.Activity;

import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class startActivity extends Activity implements OnClickListener {
    private static final String tag = "Main";
    private MalibuCountDownTimer countDownTimer;
    private long timeElapsed;
    private boolean timerHasStarted = false;
    private Button startB;
    private TextView text;
    private TextView timeElapsedView;

    private final long startTime = 22500000/3600000;
    private final long interval = 1/100;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startB = (Button) this.findViewById(R.id.button);
        startB.setOnClickListener(this);

        text = (TextView) this.findViewById(R.id.timer);
        timeElapsedView = (TextView) this.findViewById(R.id.timeElapsed);
        countDownTimer = new MalibuCountDownTimer(startTime, interval);
        text.setText(text.getText() + String.valueOf(startTime));
    }

    public void onClick(View v) {
        if (!timerHasStarted) {
            countDownTimer.start();
            timerHasStarted = true;
            startB.setText("Start");
        } else {

            countDownTimer.cancel();
            timerHasStarted = false;
            startB.setText("Stop and Reset");
        }
    }

    // CountDownTimer class
    public class MalibuCountDownTimer extends CountDownTimer {

        public MalibuCountDownTimer(long startTime, long interval) {
            super(startTime, interval);
        }

        @Override
        public void onFinish() {
            text.setText("School Finished!");
            timeElapsedView.setText("Time Passed: "
                    + String.valueOf(startTime));
        }

        @Override
        public void onTick(long millisUntilFinished) {
            text.setText("Time remain:" + millisUntilFinished);
            timeElapsed = startTime - millisUntilFinished;
            timeElapsedView.setText("Time Left: "
                    + String.valueOf(timeElapsed));
        }
    }
}

マニフェストまたはレイアウトに変更を加えていません。

ありがとう

4

1 に答える 1

3

まず、long は整数型であることを思い出してください。プライベート最終ロングインターバル = 1/100; 0.01 と同等ではありません。ゼロになると信じています。また、これは onTick を呼び出す頻度です。0.01ミリ秒ごとに呼び出されたいと言っていると思いますが、これは過剰に思えます。おそらく、100 ミリ秒ごと (1 秒間に 10 回) という意味でしょうか?

startB.setText 行を入れ替えて、停止時に「開始」を表示し、開始時に「停止」を表示するようにすることもできます。

ミリ秒を時間と分に変換しますか? 次のようなことを試すことができます: long totalMinutes = millis / 1000 / 60; 長時間 = ミリ秒 / 60; long minutes = totalMinutes - (時間 * 60);

編集: カウントダウン数 (6 時間 20 分を表す 6.2) を 10 分ごとに 0.1 ずつ減らしたい場合は、主に 2 つの方法があります。

最初のオプションは、「間隔」を 10 * 60 * 1000 (10 分のミリ秒数) に設定することです。次に、onTick で浮動小数点数 (10.0 など) を取り、0.1 ずつ減らします。それが機能するとしても、それは手っ取り早い汚い方法かもしれませんが、理想的ではありません。

2つ目は、上で説明したことを行うことです。次に、時間数と分数がある場合: float timeRemaining = (float) 時間 + (float) 分 / 100 String.format を使用してテキストビューに表示します。String.format("%.1f%n", timeRemaining) のようなもので、小数点が 1 つだけ表示されます。

私は実際にコードを試していませんでしたが、頭のてっぺんから、これは正しい方向にあなたを導くためのいくつかのヒントを与えるはずです.

于 2012-05-15T17:09:58.977 に答える