回答編集履歴

7

コードを追加

2021/10/10 08:02

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -9,3 +9,149 @@
9
9
  ~~経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から再度 CountDownTimer を設定・実行する形になると思います。
10
10
 
11
11
  (CountDownTimer を再生成することになりますので、他のボタンとの関係上、 timer もフィールドにすることになりそうです。)~~
12
+
13
+
14
+
15
+ ----
16
+
17
+
18
+
19
+ タイマーの生成・実行をローカル関数にしてみました。
20
+
21
+
22
+
23
+ ```kotlin
24
+
25
+ package com.teratail.q363662
26
+
27
+
28
+
29
+ import androidx.appcompat.app.AppCompatActivity
30
+
31
+ import android.os.Bundle
32
+
33
+ import android.os.CountDownTimer
34
+
35
+ import android.widget.Button
36
+
37
+ import android.widget.TextView
38
+
39
+
40
+
41
+ class MainActivity : AppCompatActivity() {
42
+
43
+ companion object {
44
+
45
+ private const val DEFAULT_TIME: Long = 10000 //[ms]
46
+
47
+ }
48
+
49
+
50
+
51
+ override fun onCreate(savedInstanceState: Bundle?) {
52
+
53
+ super.onCreate(savedInstanceState)
54
+
55
+ setContentView(R.layout.activity_main)
56
+
57
+
58
+
59
+ var allTime:Long = 0
60
+
61
+ var timer: CountDownTimer? = null
62
+
63
+
64
+
65
+ val textView: TextView = findViewById(R.id.textView)
66
+
67
+ val startButton: Button = findViewById(R.id.startButton)
68
+
69
+ val stopButton: Button = findViewById(R.id.stopButton)
70
+
71
+ val restartButton: Button = findViewById(R.id.restartButton)
72
+
73
+
74
+
75
+ fun buttonsState(ready: Boolean) {
76
+
77
+ startButton.isEnabled = ready
78
+
79
+ stopButton.isEnabled = !ready
80
+
81
+ restartButton.isEnabled = ready && allTime > 0L
82
+
83
+ }
84
+
85
+
86
+
87
+ fun startCountDown(millisInFuture: Long): CountDownTimer {
88
+
89
+ return object:CountDownTimer(millisInFuture, 100) {
90
+
91
+ override fun onTick(millisUntilFinished: Long) {
92
+
93
+ allTime = millisUntilFinished
94
+
95
+ textView.text = millisUntilFinished.toString()
96
+
97
+ }
98
+
99
+ override fun onFinish() {
100
+
101
+ allTime = 0
102
+
103
+ textView.text = "タイムアップ"
104
+
105
+ buttonsState(true)
106
+
107
+ }
108
+
109
+ }.start()
110
+
111
+ }
112
+
113
+
114
+
115
+ buttonsState(true)
116
+
117
+
118
+
119
+ //スタートボタン
120
+
121
+ startButton.setOnClickListener {
122
+
123
+ timer = startCountDown(DEFAULT_TIME)
124
+
125
+ buttonsState(false)
126
+
127
+ }
128
+
129
+
130
+
131
+ //ストップボタン
132
+
133
+ stopButton.setOnClickListener {
134
+
135
+ timer?.cancel()
136
+
137
+ buttonsState(true)
138
+
139
+ }
140
+
141
+
142
+
143
+ //リスタートボタン
144
+
145
+ restartButton.setOnClickListener {
146
+
147
+ timer = startCountDown(allTime)
148
+
149
+ buttonsState(false)
150
+
151
+ }
152
+
153
+ }
154
+
155
+ }
156
+
157
+ ```

6

全消し

2021/10/10 08:02

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -6,6 +6,6 @@
6
6
 
7
7
 
8
8
 
9
- 経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から再度 CountDownTimer を設定・実行する形になると思います。
9
+ ~~経過時間を保存する"フィールド"を用意し、 onTick が呼ばれる度に p0 をそのフィールドに保存しておき、リスタートボタン押下時に、そのフィールドの値から再度 CountDownTimer を設定・実行する形になると思います。
10
10
 
11
- (CountDownTimer を再生成することになりますので、他のボタンとの関係上、 timer もフィールドにすることになりそうです。)
11
+ (CountDownTimer を再生成することになりますので、他のボタンとの関係上、 timer もフィールドにすることになりそうです。)~~

5

間違っている個所を消し

2021/10/10 06:27

投稿

jimbe
jimbe

スコア13209

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

4

修正

2021/10/10 06:19

投稿

jimbe
jimbe

スコア13209

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

3

追加等

2021/10/10 05:25

投稿

jimbe
jimbe

スコア13209

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

2

修正

2021/10/10 05:20

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- alltime は onCreate 内の変数ですから、 restartButton.setOnClickListener に設定する OnClickListener オブジェクトからアクセスできないのは当然です。
5
+ alltime は onCreate 内み実体のある変数ですから、onCreate が終われば消えます。 restartButton.setOnClickListener (に設定する OnClickListener オブジェクト) からアクセスできないのは当然です。

1

修正

2021/10/10 05:14

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -2,4 +2,4 @@
2
2
 
3
3
 
4
4
 
5
- alltime は onCreate 内の変数ですから、 restartButton.setOnClickListener からアクセスできないのは当然です。
5
+ alltime は onCreate 内の変数ですから、 restartButton.setOnClickListener に設定する OnClickListener オブジェクトからアクセスできないのは当然です。