0

ストップウォッチを持っていますが、正常に動作しますが、ホームボタンまたはボタンクロージングベルを押してしばらくしてから再度開くと、ストップウォッチの時刻が間違っています。この問題を解決するために私にできることを教えてください。

public class Stopwatch extends Activity {
    Timer mTimer;
    int second_f_p = 0, second_s_p = 0, millisecond = 0;
    int minute_f_p = 0, minute_s_p;
    int hour_f_p = 0, hour_s_p = 0;
    int numberOfLap = 0;
    TextView tv;
    TextView TVlap;
    Button btn_start;

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

        btn_start = (Button) this.findViewById(R.id.button1);
        tv = (TextView) this.findViewById(R.id.tvTime);
        btn_start.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View arg0) {
                btn_start.setClickable(false);
                mTimer = new Timer();
                mTimer.schedule(new TimerTask() {

                    @Override
                    public void run() {
                        timerMethod();
                    }

                }, 0, 100);

            }
        });

        Button btn_stop = (Button) this.findViewById(R.id.button2);
        btn_stop.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View v) {
                btn_start.setClickable(true);
                mTimer.cancel();
            }

        });

        Button btn_reset = (Button) this.findViewById(R.id.button4);
        btn_reset.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View v) {

                second_f_p = 0;
                second_s_p = 0;
                minute_f_p = 0;
                minute_s_p = 0;
                millisecond = 0;
                hour_f_p = 0;
                hour_s_p = 0;
                numberOfLap = 0;
                TVlap.setText("");
                tv.setText(String.valueOf(hour_f_p) + String.valueOf(hour_s_p) + ":" + String.valueOf(minute_f_p) + String.valueOf(minute_s_p) + ":" + String.valueOf(second_f_p) + String.valueOf(second_s_p) + "." + String.valueOf(millisecond));
            }

        });
        TVlap = (TextView) this.findViewById(R.id.tvLap);
        Button btn_lap = (Button) this.findViewById(R.id.button3);
        btn_lap.setOnClickListener(new View.OnClickListener() {@Override
            public void onClick(View v) {
                numberOfLap++;
                TVlap.setText(TVlap.getText() + String.valueOf(numberOfLap) + ". " + String.valueOf(hour_f_p) + String.valueOf(hour_s_p) + ":" + String.valueOf(minute_f_p) + String.valueOf(minute_s_p) + ":" + String.valueOf(second_f_p) + String.valueOf(second_s_p) + "." + String.valueOf(millisecond) + "\n");
            }

        });

    }

    private void timerMethod() {
        this.runOnUiThread(doSomething);
    }

    private final Runnable doSomething = new Runnable() {@Override
        public void run() {
            millisecond++;

            if (millisecond == 10) {
                second_s_p++;
                millisecond = 0;

            }

            if (second_s_p == 10) {
                second_f_p++;
                second_s_p = 0;
            }
            if (second_f_p == 6) {
                minute_s_p++;
                second_f_p = 0;
            }
            if (minute_s_p == 10) {
                minute_f_p++;
                minute_s_p = 0;
            }
            if (minute_f_p == 6) {
                hour_s_p++;
                minute_f_p = 0;
            }

            if (hour_s_p == 10) {
                hour_f_p++;
                hour_s_p = 0;
            }

            if (hour_f_p == 9 && hour_s_p == 9) {
                second_f_p = 0;
                second_s_p = 0;
                minute_f_p = 0;
                minute_s_p = 0;
                hour_f_p = 0;
                hour_s_p = 0;
            }
            tv.setText(String.valueOf(hour_f_p) + String.valueOf(hour_s_p) + ":" + String.valueOf(minute_f_p) + String.valueOf(minute_s_p) + ":" + String.valueOf(second_f_p) + String.valueOf(second_s_p) + "." + String.valueOf(millisecond));
        }

    };

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_stopwatch, menu);
        return true;
    }

}
4

1 に答える 1

0

以下のコードリンクを参照してください

http://www.edumobile.org/android/android-development/stop-watch-example/

Chronometer クラスのソースを見ると、経過時間がフィールドに保存されておらず、表示を更新する必要があるたびに内部で計算されていることがわかります。

ただし、独自のコードで同じことを行うのは比較的簡単です。

long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase();

これは、次のように時計を開始したことを前提としています。

chronometerInstance.setBase(SystemClock.elapsedRealtime());
chronometerInstance.start();

完全な例を次に示します。

public class ChronoExample extends Activity {
Chronometer mChronometer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    mChronometer = new Chronometer(this);
    layout.addView(mChronometer);

    Button startButton = new Button(this);
    startButton.setText("Start");
    startButton.setOnClickListener(mStartListener);
    layout.addView(startButton);

    Button stopButton = new Button(this);
    stopButton.setText("Stop");
    stopButton.setOnClickListener(mStopListener);
    layout.addView(stopButton);

    Button resetButton = new Button(this);
    resetButton.setText("Reset");
    resetButton.setOnClickListener(mResetListener);
    layout.addView(resetButton);        

    setContentView(layout);
}

private void showElapsedTime() {
    long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();            
    Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, 
            Toast.LENGTH_SHORT).show();
}

View.OnClickListener mStartListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.start();
        showElapsedTime();
    }
};

View.OnClickListener mStopListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.stop();
        showElapsedTime();
    }
};

View.OnClickListener mResetListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.setBase(SystemClock.elapsedRealtime());
        showElapsedTime();
    }
};
}

Chronometer についてやや混乱する点の 1 つは、開始、停止、再起動を繰り返すストップウォッチとして実際に使用できないことです。実行中は、最後にリセットしてからの経過時間が常に表示されます。その間に何度も、どれだけ長く停止してもかまいません。停止すると、単に表示の更新が停止します。

于 2012-11-26T07:36:17.810 に答える