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

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

ただいまの
回答率

87.79%

CountDownTimerの実装の際、カウントダウン(cancel)の途中停止が上手くいきません。

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 3,433

score 8

初めての投稿になります。

Android Studio(Java使用)を使って、カウントダウンタイマーのアプリを作っています。
タイマーの主な機能は、条件分岐により、3分・4分・5分のタイム設定を選択してカウントダウンを行うというものです。
onClickとCountDownTimerによって各ボタン(タイム選択3パターン、スタート、ストップ)及びそれらの処理をしており、タイムを選択した上でカウントダウンをスタートすることはできます。
しかし、様々なサイトで調べながら解決法を探ったのですが、cancel()によってカウントダウンを途中で止めることができません。

どのようにしたら、カウントダウンを途中で停止できるのでしょうか。
よろしくお願いいたします。

 該当のソースコード

public class Timer extends Activity implements View.OnClickListener {

    //タイム表示変数
    private TextView timer;

    //時刻関係
    private SimpleDateFormat dateformat = new SimpleDateFormat("mm:ss", Locale.US);

    //タイムカウンター変数
    long count_time;

    //タイムインターバル
    long interval = 10;

    //各ボタン変数宣言
    Button button1;
    Button button2;
    Button button3;
    Button start_button;
    Button stop_button;

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

        //タイムセットボタン(3分・4分・5分)
        button1 = (Button) findViewById(R.id.button1); //3分
        button2 = (Button) findViewById(R.id.button2); //4分
        button3 = (Button) findViewById(R.id.button3); //5分

        //スタート・ストップボタン
        start_button = (Button) findViewById(R.id.start_button);
        stop_button = (Button) findViewById(R.id.stop_button);

        //リスナー設定
        button1.setOnClickListener((View.OnClickListener) this);
        button2.setOnClickListener((View.OnClickListener) this);
        button3.setOnClickListener((View.OnClickListener) this);

        //タイマー部分表示
        timer = findViewById(R.id.timer_display);
        timer.setText(dateformat.format(0));
    }

    //タイムセットボタン動作処理
    @Override
    public void onClick(View view) {
        int id = view.getId();
        switch (id) {
            case R.id.button1:
                count_time = 180000; //3 min = 3*60*1000 msec
                timer.setText(dateformat.format(count_time));
                break;
            case R.id.button2:
                count_time = 240000; //4 min = 4*60*1000 msec
                timer.setText(dateformat.format(count_time));
                break;
            case R.id.button3:
                count_time = 300000; //5 min = 5*60*1000 msec
                timer.setText(dateformat.format(count_time));
                break;
        }
        //スタート・ストップボタンクラスリスナー
        start_button.setOnClickListener(new StartButtonClick());
        stop_button.setOnClickListener(new StopButtonClick());
    }

    //スタート・ストップボタン動作クラス
    class StartButtonClick implements  View.OnClickListener
    {
        //クラスCountDownのインスタンス
        final CountDown counter = new CountDown(count_time, interval);
        @Override
        public void onClick(View v)
        {
            if(v.getId() == R.id.start_button)
            {
                    counter.start();
            }
        }
    }
    class StopButtonClick implements  View.OnClickListener 
  {
        final CountDown counter = new CountDown(count_time, interval);
        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.stop_button) {
                counter.cancel();
                timer.setText(dateformat.format(0));
            }
        }
    }

    //カウントダウン処理クラス
    class CountDown extends CountDownTimer {

        CountDown(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }
        //カウント終了
        public void onFinish() {
            timer.setText(dateformat.format(0));
        }
        //インターバル
        public void onTick(long millisUntilFinished) {
            timer.setText(dateformat.format(millisUntilFinished));
        }
    }
}

 補足情報(FW/ツールのバージョンなど)

Android Studio 3使用

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

1つのカウントダウンタイマーとして処理するならば、スタートとストップで共通のCountDownのインスタンスを参照しなければなりません。ご提示いただいたコードでは、StartButtonClickとStopButtonClickでそれぞれCountDownのインスタンスを生成していますが、それでは一方のcounterは他方のcounterの内容を知り得ませんから、1つのカウンターとして処理をすることができません。

下図のような修正をすれば意図した動作になるのではないでしょうか。

    CountDown counter; // フィールドとして宣言

    // 中略

    //スタート・ストップボタン動作クラス
    class StartButtonClick implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.start_button) {
                counter = new CountDown(count_time, interval);
                counter.start();
            }
        }
    }

    class StopButtonClick implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            if (v.getId() == R.id.stop_button) {
                if(counter != null) {
                    counter.cancel();
                    timer.setText(dateformat.format(0));
                    counter = null;
                }
            }
        }
    }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/03/26 21:50

    ご回答ありがとうございます。
    ご教示くださったアドバイスの通りに修正したところ、意図していた動作をするようになり、解決することができました。

    この度はありがとうございました。

    キャンセル

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

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

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