質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

[AndroidJava](ストップウォッチ)一時停止ボタンを押したときに、内部のカウントが止まらない

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 909

ShuperDark

score 11

前提・実現したいこと

一時停止ボタン(btn1)を押したとき、今のカウントを記憶しようとして再開したときに、どうしても内部のカウントが進んでしまうので、しっかり途中から再開されるようにしたい。
※たとえば、今のカウント時間が00:00:05.00くらいだとして一時停止ボタンを押したとき心の中で「3秒。。。4秒。。。」と数えて再開すると内部でカウントされて「00:00:09.00」などから始まって、途中からカウントされない。

該当のソースコード

MainActivity.java

package com.example.kadaitimer;

import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.os.Bundle;
import android.text.format.DateFormat;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    private long startTime = System.currentTimeMillis();

    private long endTime = 0;

    private long diffTime = 0;

    private long saveValue = 0;

    private Button btn1 = null;//一時停止/再開
    private Button btn2 = null;//初期化

    private TextView time = null;

    private Timer timer = new Timer();

    private volatile boolean stopRun = false;

    private volatile int flag = 0;

    private SimpleDateFormat dataformat = new SimpleDateFormat("HH:mm:ss.SS", Locale.JAPAN);

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

        btn1 = (Button)findViewById(R.id.button1);
        btn2 = (Button)findViewById(R.id.button2);

        time = (TextView)findViewById(R.id.textView1);
        time.setText(dataformat.format(0));

        final TimerTask task = new TimerTask() {
            @Override
            public void run() {

                int period = 10;

                while (!stopRun) {

                    try {
                        saveValue = diffTime;
                        Thread.sleep(period);
                    }
                    catch (InterruptedException e) {
                        e.printStackTrace();
                        stopRun = true;
                    }

                runOnUiThread(new Runnable() {
                    public void run() {
                        if(flag == 2) {
                            diffTime = saveValue;
                        } else {
                        endTime = System.currentTimeMillis();
                        // カウント時間 = 経過時間 - 開始時間
                        diffTime = (endTime - startTime);//endTime - startTime

                        time.setText(dataformat.format(diffTime));//diffTime
                        }
                    }
                });
            }
        }
        };

        timer.schedule(task, 10, 10);

        btn1.setClickable(true);
        btn1.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Thread thread;

                if(stopRun == true) {

                    if(flag == 1) {
                        startTime = System.currentTimeMillis();
                        time.setText(dataformat.format(0));

                        flag = 0;
                    } else if(flag == 2) {
                        time.setText(dataformat.format(0));

                        flag = 0;
                    }

                stopRun = false;

                thread = new Thread();
                thread.start();

                } else {
                    flag = 2;
                    stopRun = true;
                }
                }
        });

        btn2.setClickable(true);
        btn2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                flag = 1;

                stopRun = true;
                startTime = System.currentTimeMillis();
                time.setText(dataformat.format(0));
                }
        });
    }

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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

試したこと

flagなど変数を作ったり、カウント時間を記憶する変数を作ってみるも、うまくいかず。。。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

startTimeがいじられてないのに、endTimeが現在時刻で更新された状態で表示するので、常に「最初に開始を押した時刻」と「現在時刻」との差を取ってしまいます。
そうしないためには、経過時間を取っておいて、再開するときは改めてstartTimeを取って経過時間に累積させていくといったやり方になるのでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/03 11:36

    ええと。。。コードに表すとどういう感じになるのでしょうか?
    すいません。。。初心者で。。。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • [AndroidJava](ストップウォッチ)一時停止ボタンを押したときに、内部のカウントが止まらない