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

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

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

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

Android

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

Q&A

解決済

CountDownTimerのcancelについて

syosinsya109
syosinsya109

総合スコア36

Java

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

Android

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

1回答

0グッド

0クリップ

311閲覧

投稿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

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答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

総合スコア10817

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

Java

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

Android

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