teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

コードを追加

2021/10/10 08:02

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -3,4 +3,77 @@
3
3
  ~~alltime は onCreate 内にのみ実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からはアクセスできないということではないでしょうか。~~
4
4
 
5
5
  ~~経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から再度 CountDownTimer を設定・実行する形になると思います。
6
- (CountDownTimer を再生成することになりますので、他のボタンとの関係上、 timer もフィールドにすることになりそうです。)~~
6
+ (CountDownTimer を再生成することになりますので、他のボタンとの関係上、 timer もフィールドにすることになりそうです。)~~
7
+
8
+ ----
9
+
10
+ タイマーの生成・実行をローカル関数にしてみました。
11
+
12
+ ```kotlin
13
+ package com.teratail.q363662
14
+
15
+ import androidx.appcompat.app.AppCompatActivity
16
+ import android.os.Bundle
17
+ import android.os.CountDownTimer
18
+ import android.widget.Button
19
+ import android.widget.TextView
20
+
21
+ class MainActivity : AppCompatActivity() {
22
+ companion object {
23
+ private const val DEFAULT_TIME: Long = 10000 //[ms]
24
+ }
25
+
26
+ override fun onCreate(savedInstanceState: Bundle?) {
27
+ super.onCreate(savedInstanceState)
28
+ setContentView(R.layout.activity_main)
29
+
30
+ var allTime:Long = 0
31
+ var timer: CountDownTimer? = null
32
+
33
+ val textView: TextView = findViewById(R.id.textView)
34
+ val startButton: Button = findViewById(R.id.startButton)
35
+ val stopButton: Button = findViewById(R.id.stopButton)
36
+ val restartButton: Button = findViewById(R.id.restartButton)
37
+
38
+ fun buttonsState(ready: Boolean) {
39
+ startButton.isEnabled = ready
40
+ stopButton.isEnabled = !ready
41
+ restartButton.isEnabled = ready && allTime > 0L
42
+ }
43
+
44
+ fun startCountDown(millisInFuture: Long): CountDownTimer {
45
+ return object:CountDownTimer(millisInFuture, 100) {
46
+ override fun onTick(millisUntilFinished: Long) {
47
+ allTime = millisUntilFinished
48
+ textView.text = millisUntilFinished.toString()
49
+ }
50
+ override fun onFinish() {
51
+ allTime = 0
52
+ textView.text = "タイムアップ"
53
+ buttonsState(true)
54
+ }
55
+ }.start()
56
+ }
57
+
58
+ buttonsState(true)
59
+
60
+ //スタートボタン
61
+ startButton.setOnClickListener {
62
+ timer = startCountDown(DEFAULT_TIME)
63
+ buttonsState(false)
64
+ }
65
+
66
+ //ストップボタン
67
+ stopButton.setOnClickListener {
68
+ timer?.cancel()
69
+ buttonsState(true)
70
+ }
71
+
72
+ //リスタートボタン
73
+ restartButton.setOnClickListener {
74
+ timer = startCountDown(allTime)
75
+ buttonsState(false)
76
+ }
77
+ }
78
+ }
79
+ ```

6

全消し

2021/10/10 08:02

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -2,5 +2,5 @@
2
2
 
3
3
  ~~alltime は onCreate 内にのみ実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からはアクセスできないということではないでしょうか。~~
4
4
 
5
- 経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から再度 CountDownTimer を設定・実行する形になると思います。
5
+ ~~経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から再度 CountDownTimer を設定・実行する形になると思います。
6
- (CountDownTimer を再生成することになりますので、他のボタンとの関係上、 timer もフィールドにすることになりそうです。)
6
+ (CountDownTimer を再生成することになりますので、他のボタンとの関係上、 timer もフィールドにすることになりそうです。)~~

5

間違っている個所を消し

2021/10/10 06:27

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -1,6 +1,6 @@
1
- > それをalltimeに代入しようとしたのですが、アクセスできないため
1
+ ~~ >それをalltimeに代入しようとしたのですが、アクセスできないため~~
2
2
 
3
- alltime は onCreate 内にのみ実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からはアクセスできないということではないでしょうか。
3
+ ~~alltime は onCreate 内にのみ実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からはアクセスできないということではないでしょうか。~~
4
4
 
5
5
  経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から再度 CountDownTimer を設定・実行する形になると思います。
6
6
  (CountDownTimer を再生成することになりますので、他のボタンとの関係上、 timer もフィールドにすることになりそうです。)

4

修正

2021/10/10 06:19

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -1,5 +1,6 @@
1
1
  > それをalltimeに代入しようとしたのですが、アクセスできないため
2
2
 
3
- alltime は onCreate 内にのみ実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からはアクセスできないでしょう。
3
+ alltime は onCreate 内にのみ実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からはアクセスできないということはないでしょう
4
4
 
5
- 経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から CountDownTimer を設定・実行する形になると思います。
5
+ 経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から再度 CountDownTimer を設定・実行する形になると思います。
6
+ (CountDownTimer を再生成することになりますので、他のボタンとの関係上、 timer もフィールドにすることになりそうです。)

3

追加等

2021/10/10 05:25

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -1,3 +1,5 @@
1
1
  > それをalltimeに代入しようとしたのですが、アクセスできないため
2
2
 
3
- alltime は onCreate 内にのみ実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からアクセスできないのは当然
3
+ alltime は onCreate 内にのみ実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からアクセスできないでしょう
4
+
5
+ 経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から CountDownTimer を設定・実行する形になると思います。

2

修正

2021/10/10 05:20

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -1,3 +1,3 @@
1
1
  > それをalltimeに代入しようとしたのですが、アクセスできないため
2
2
 
3
- alltime は onCreate 内の変数ですから、 restartButton.setOnClickListener に設定する OnClickListener オブジェクトからアクセスできないのは当然です。
3
+ alltime は onCreate 内み実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からアクセスできないのは当然です。

1

修正

2021/10/10 05:14

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -1,3 +1,3 @@
1
1
  > それをalltimeに代入しようとしたのですが、アクセスできないため
2
2
 
3
- alltime は onCreate 内の変数ですから、 restartButton.setOnClickListener からアクセスできないのは当然です。
3
+ alltime は onCreate 内の変数ですから、 restartButton.setOnClickListener に設定する OnClickListener オブジェクトからアクセスできないのは当然です。