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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

923閲覧

for文を使用しても最終回しか実行されない

Summ

総合スコア1

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2021/12/08 04:15

編集2021/12/08 05:44

前提・実現したいこと

AndroidStudioでJavaを使用しアプリ開発をしています。
その中で、for文を使用し、入力された回数分2つのカウントダウンタイマーを
繰り返し交互に動かすという機能を作りたいのですが、うまくいきません。
AndroidStudioもJavaも初心者であり、ネットの知識を寄せ集めて
必死に何とか作成している為for文ではない他の部分が問題なのかもしれませんが、
一応該当するであろうコードを載せておきます。

発生している問題・エラーメッセージ

現在繰り返されているのが何回目かをその都度表示させるようにしているのですが、
いきなり最終回の回数が表示され、1度実行すると終了してしまいます。
(5回繰り返す場合はいきなり5と表示され1度実行すると終了される)

該当のソースコード

java

1package com.websarva.wings.android.timertest; 2 3import android.os.Bundle; 4import android.os.CountDownTimer; 5import android.view.View; 6import android.widget.Button; 7import android.view.View.OnClickListener; 8import android.widget.EditText; 9import android.widget.Toast; 10 11import androidx.appcompat.app.AppCompatActivity; 12 13 14public class MainActivity extends AppCompatActivity { 15 16 // アラート音 17 private SoundPlayer soundPlayer; 18 19 20 @Override 21 protected void onCreate(Bundle savedInstanceState) { 22 23 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_main); 26 27 soundPlayer = new SoundPlayer(this); 28 29 final String START_MESSAGE = "START"; 30 final String STOP_MESSAGE = "STOP"; 31 final String FINISH_MESSAGE = "終了"; 32 final EditText editTime = findViewById(R.id.editTime); //活動時間 33 final EditText editTime2 = findViewById(R.id.editTime2); //インターバル 34 final EditText editTime3 = findViewById(R.id.editTime3); //セット数 35 final CountDownTimer[] cdt = new CountDownTimer[1]; //活動時間のカウントダウンタイマー 36 final CountDownTimer[] cdt2 = new CountDownTimer[1]; //インターバルのカウントダウンタイマー 37 38 39 Button StartButton = findViewById(R.id.StartButton); 40 Button StopButton = findViewById(R.id.StopButton); 41 42 43 44 StartButton.setOnClickListener(new View.OnClickListener() { 45 @Override 46 public void onClick (View v){ 47 48 49 // 始まりの合図 50 Toast toast1 = Toast.makeText(MainActivity.this, START_MESSAGE, Toast.LENGTH_SHORT); 51 toast1.show(); 52 53 54 // 入力時間取得 55 int inputTime = Integer.parseInt(String.valueOf(editTime.getText())); 56 int inputTime2 = Integer.parseInt(String.valueOf(editTime2.getText())); 57 int inputTime3 = Integer.parseInt(String.valueOf(editTime3.getText())); 58 59 60 //ここからセット数繰り返す 61 62 for (int i=1; i < inputTime3+1 ; i++) { 63 64   //残りのセット数を表示する 65   editTime3.setText(Long.toString(i)); 66 67   // 活動時間のカウントダウン 68 69   cdt[0] = new CountDownTimer(inputTime * 1000, 1000) { 70 @Override 71   public void onTick(long millisUntilFinished) { 72 editTime.setText(Long.toString(millisUntilFinished / 1000)); 73 } 74 75 @Override 76 public void onFinish() { 77 78 //終わりの合図 79 toast1.show(); 80 81 editTime.setText("0"); 82 //活動時間終わりのブザー音を鳴らす 83 soundPlayer.playendSound(); 84 85 //活動時間の元の秒数を表示する 86 editTime.setText(Long.toString(inputTime)); 87 88 89 //インターバル用のタイマーが作動する 90 cdt2[0] = new CountDownTimer(inputTime2 * 1000, 1000) { 91 @Override 92 public void onTick(long millisUntilFinished) { 93 editTime2.setText(Long.toString(millisUntilFinished / 1000)); 94 } 95 96 97 @Override 98 public void onFinish() { 99 100 //インターバルの終わりの合図 101 Toast toast2 = Toast.makeText(MainActivity.this, FINISH_MESSAGE, Toast.LENGTH_SHORT); 102 toast2.show(); 103 104 editTime2.setText("0"); 105 //インターバル終わりのブザー音を鳴らす 106 soundPlayer.playendSound(); 107 108 109 //インターバルの元の秒数を表示する 110 editTime2.setText(Long.toString(inputTime2)); 111 112 } 113 114 }.start(); 115 } 116  }.start(); 117 118 } 119 120 } 121 122 }); 123 124 125 StopButton.setOnClickListener(new OnClickListener() { 126 127 @Override 128 public void onClick (View v){ 129 130 // ストップ 131 Toast toast = Toast.makeText(MainActivity.this, STOP_MESSAGE, Toast.LENGTH_SHORT); 132 toast.show(); 133 134 // タイマー停止 135 cdt[0].cancel(); 136 cdt2[0].cancel(); 137 138 } 139 }); 140 141 } 142} 143 144

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2021/12/08 04:36 編集

コードのマークダウンはコードや画面に表示されたモノをそのままご提示される場合にお使いください。 日本語での説明であれば、コードのマークダウンを用いると読み難くなるだけです。 > 一応該当するであろうコード 「うまく」動作しない状態を確認するのに必要な「コピペすればそのように動作する」コードをご提示ください。
jimbe

2021/12/08 04:40

以前、たしか何かの運動の時間を計測・通知するアプリを作っているかたの質問がありましたが、そんなアプリなのでしょうか。
Summ

2021/12/08 04:53

すみません。このサイトを初めて使うので知識不足で、androidStudioから 自分の書いていたコードそのままコピペしてしまいました。 この部分では、運動時間と休憩時間を交互に行い続けるようなトレーニングを する際に音で知らせてくれる機能を作りたくて作成しています。
jimbe

2021/12/08 05:01

> 自分の書いていたコードそのままコピペしてしまいました いえ、コードのご提示のされ方はそれで完全です。問題視しましたのは、「一応該当するであろうコード」という表現で表されている"不確実さ"です。なぜ「一応」や「あろう」と表現されるコードをご提示なのか、という点です。 > 運動時間と休憩時間を交互に行い続けるようなトレーニング 確か、20 秒運動して10秒休んでを数回繰り返すのが 1 セットでそれを何セットする・・・とかいう機能ですね(秒数や回数は実際は入力する形)。 自分の回答から昔の質問を探そうとしたのですが、いつのどんなタイトルの質問だったかすっかり忘れてしまって…。
Summ

2021/12/08 05:12 編集

かなりの初心者で、圧倒的知識不足のまま深く理解せずとりあえず書いている部分も 多々あるため、自分では原因部分が絞れず、見当違いな部分を表示してしまっているのではと 思い曖昧な表現をしてしまいました。 まさにそのような機能が作りたいです! 同じような過去質問があったのですね。自分の調べ不足でした。探してみます。
jimbe

2021/12/08 05:22

>見当違いな部分を表示してしまっているのではと思い 自信が無いのは理解できます(逆に自信満々でも後々面倒だったりします)が、コード自体は実際に存在しているモノであれば大丈夫です。 ただ、出来るだけ「動作する状態」が望ましいですので、例えばご提示のコード以外に"新規に作ったモノ"や"プロジェクト作成時に自動で作られたモノを修正したモノ"があれば、それらも出来るだけ(ご質問には1万文字の文字数制限があります)ご提示ください。 過去の質問を見つけました。 [for文を使ったCountDownTimerの作り方がわかりません](https://teratail.com/questions/259715 ) もう一年半以上前になりますね^^; 実現されようとしていることは同じですが、内容的にはまだ難しいかもしれません。
Summ

2021/12/08 05:32

分かりやすく説明していただきすみません。。。助かります。 気を付けていきたいと思います! ありがとうございます。拝見させていただきます。 頑張って理解していきたいと思います。お手数おかけしました。
jimbe

2021/12/08 10:15 編集

259715 にはレイアウトを出していなかったので、パソコンに残っていたプロジェクトからレイアウトを直して(コードやリソースも含めて) GitHub に入れました。 ついでにラムダ式化やプログレスの色変え等少し直しました。 https://github.com/Jimbe-github/terateil-Q259715
Summ

2021/12/09 00:04

わざわざご丁寧にありがとうございます。 ものすごく助かります…。少しずつ嚙み砕いて学んでいきたいと思います。 本当にありがとうございました。
guest

回答1

0

ベストアンサー

CountDownTimer はマルチスレッドで動作し、 start() したらアクティビティの動作と切り離されて裏で動作するものですので、「カウントダウンが終わるまで start() の所で止まっているモノ」ではありません。

投稿2021/12/08 04:47

jimbe

総合スコア12756

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問