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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

870閲覧

CountDownTimerのcancelについて

syosinsya109

総合スコア41

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2022/11/28 10:34

前提

androidについて質問します。
自分はandroidでカウントダウンタイマーを作っています。
主な機能はスタート機能とストップ機能です。
しかしストップを押して、スタートを押すとカウントダウンが最初空になってしまいます。それを途中から再開させるにはどのようにしたらいいのでしょうか。

実現したいこと

CountDownTimerでカウントダウンを作成したい

該当のソースコード

MainActivity.java

1import androidx.appcompat.app.AppCompatActivity; 2 3import android.content.Intent; 4import android.os.Bundle; 5import android.os.CountDownTimer; 6import android.view.View; 7import android.widget.Button; 8import android.widget.TextView; 9 10public class MainActivity extends AppCompatActivity { 11 12 CountDownTimer countDownTimer; // タイマー本体 13 long alltime = 10000; // タイマー終了時間 14 15 @Override 16 protected void onCreate(Bundle savedInstanceState) { 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 20 Button start = findViewById(R.id.start); 21 start.setOnClickListener((View v) -> { 22 countDownTimer.start(); 23 }); 24 Button stop = findViewById(R.id.stop); 25 stop.setOnClickListener((View v) -> { 26 countDownTimer.cancel(); 27 }); 28 } 29 30 31 // 画面非表示に実行 //////////////////////////////// 32 @Override 33 protected void onPause() { 34 super.onPause(); 35 countDownTimer.cancel(); 36 countDownTimer = null; 37 } 38 39 // 画面再表示に実行 ////////////////////////////////// 40 @Override 41 protected void onResume() { 42 super.onResume(); 43 countDownTimer = new CountDownTimer(alltime, 100) { 44 @Override 45 public void onTick(long millisUntilFinished) { 46 alltime= millisUntilFinished; 47 int time = (int)millisUntilFinished /1000; 48 ((TextView)findViewById(R.id.tv)).setText("あと" + time + "秒"); 49 } 50 @Override 51 public void onFinish() { 52 Intent intent = new Intent(MainActivity.this,MainActivity.class); 53 startActivity(intent); 54 } 55 }.start(); 56 } 57}

activity_main.xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 android:gravity="center" 8 android:orientation="vertical" 9 android:padding="20dp" 10 tools:context=".MainActivity"> 11 12 <TextView 13 android:id="@+id/tv" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 android:text="Hello World!" 17 android:textSize="30sp" /> 18 19 <Button 20 android:id="@+id/start" 21 android:layout_width="0dp" 22 android:layout_height="wrap_content" 23 android:layout_marginStart="8dp" 24 android:layout_marginTop="8dp" 25 android:layout_marginEnd="8dp" 26 android:text="スタート" 27 app:layout_constraintEnd_toEndOf="parent" 28 app:layout_constraintStart_toStartOf="parent" 29 app:layout_constraintTop_toTopOf="@+id/guideline2" /> 30 31 <Button 32 android:id="@+id/stop" 33 android:layout_width="0dp" 34 android:layout_height="wrap_content" 35 android:layout_marginStart="8dp" 36 android:layout_marginTop="8dp" 37 android:layout_marginEnd="8dp" 38 android:text="ストップ" 39 app:layout_constraintEnd_toEndOf="parent" 40 app:layout_constraintStart_toStartOf="parent" 41 app:layout_constraintTop_toBottomOf="@+id/start" /> 42 43 <androidx.constraintlayout.widget.Guideline 44 android:id="@+id/guideline2" 45 android:layout_width="wrap_content" 46 android:layout_height="wrap_content" 47 android:orientation="horizontal" 48 app:layout_constraintGuide_percent="0.14" /> 49 50</androidx.constraintlayout.widget.ConstraintLayout>

試したこと

参考ソースを見て試してみましたがダメでした。
参照先
http://hakoniwadesign.com/?p=10775

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

CountDownTimer#cancel は途中で終わらせるのであって、一時停止ではありません。
onResume で再開の為に何をしているのかを参考にしてください。

ボタン操作による一時停止等は以下の記事がありました。
カウントダウンタイマーを、1つのボタンで開始、一時停止、リセットする。


java

1import androidx.appcompat.app.AppCompatActivity; 2 3//import android.content.Intent; 4import android.os.Bundle; 5import android.os.CountDownTimer; 6import android.widget.Button; 7import android.widget.TextView; 8 9public class MainActivity extends AppCompatActivity { 10 private CountDownTimer countDownTimer; // タイマー本体 11 private long alltime = 10*1000; // タイマー終了時間[ms] 12 private TextView textView; // 残り時間表示 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.activity_main); 18 19 textView = findViewById(R.id.tv); 20 21 Button start = findViewById(R.id.start); 22 start.setOnClickListener(v -> startCountDown()); 23 24 Button stop = findViewById(R.id.stop); 25 stop.setOnClickListener(v -> stopCountDown()); 26 } 27 28 private void startCountDown() { 29 if(countDownTimer != null) return; 30 countDownTimer = new CountDownTimer(alltime, 100) { 31 @Override 32 public void onTick(long millisUntilFinished) { 33 alltime = millisUntilFinished; 34 int time = (int)millisUntilFinished / 1000; 35 textView.setText("あと" + time + "秒"); 36 } 37 @Override 38 public void onFinish() { 39 stopCountDown(); 40 41 alltime = 10*1000; 42 startCountDown(); 43 //Intent intent = new Intent(MainActivity.this, MainActivity.class); 44 //startActivity(intent); 45 } 46 }.start(); 47 } 48 49 private void stopCountDown() { 50 if(countDownTimer == null) return; 51 countDownTimer.cancel(); 52 countDownTimer = null; 53 } 54 55 // 画面非表示に実行 //////////////////////////////// 56 @Override 57 protected void onPause() { 58 super.onPause(); 59 stopCountDown(); 60 } 61 62 // 画面再表示に実行 ////////////////////////////////// 63 @Override 64 protected void onResume() { 65 super.onResume(); 66 startCountDown(); 67 } 68}

投稿2022/11/28 11:05

編集2022/11/28 15:45
jimbe

総合スコア12648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syosinsya109

2022/11/28 12:10

回答ありがとうございます。 送ってくださったurlを参考にさせていただいたのですが、うまく動かなかったので2つ質問出せてください。 1つ目は、送ってくださったURLに「タイマーをストップ」と言うコメントの横に「cancel()」と言うメソッドがやはりありました。それが一時停止ではないのであればどこで一時停止を行っているのでしょうか。 2つ目は、自分が質問させていたURLについてです。自分のコードにも同じコードを書いているのですが、画面非表示に実行するというonPauseメソッドの中身は super.onPause(); countDownTimer.cancel(); countDownTimer = null; となっているのですが、ここでcancel()しているにもかかわらず、アプリを中断してもカウントはリセットされないのはどうしてなのでしょうか。
jimbe

2022/11/28 13:07 編集

『一時停止だから止め方に秘密がある』とお考えのようですが、そうではありません。 両方のリンク先での処理(="一時停止"という状況の作り方)で肝なのは、CountDownTimer の止め方では無く再開の仕方です。 見るべきは onPause では無く onResume のほうで、リセットされないのでは無く再開時に ( 新しい CountDownTimer で ) 最後の残り時間から始めることです。
syosinsya109

2022/11/28 14:43

なるほど、start.setOnClickListenerの所でonResume()を書くことにより、無事途中から再開することができました!ありがとうございました!
jimbe

2022/11/28 15:10

もし、countDownTimer.start(); を onResume(); にしたということでしたら、それは止めたほうが良いかもしれません。 onResume() の先頭で super.onResume() を呼んでいるからで、もし super.onResume() 内で実際に RESUME 状態であることに依存した処理をしていたら問題が発生するかもしれません。 onResume() 内で行っている (super.onResume(); 以外の) 処理を別メソッド ( 例えば void startCountDown() {~} とか ) に抜き出し、 onResume() の super.onResume(); の後と start.setOnClickListener のそれぞれでそのメソッドを呼ぶ形が良いように思います。 (同様に停止のほうも stopCountDown() {~} とかにすると、メソッドの対称性があって良いとも思います。)
syosinsya109

2022/11/28 16:26

分かりました!アドバイスありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問