はじめに
こんにちは、mAgmAです。
めちゃめちゃお久しぶりな更新になっております!
というのも、先日まで基本情報B試験の勉強に時間を使っておりまして全くこの開発に時間を割いておりませんでした。
その成果もありまして、試験は無事合格しましたので、今日からまた気を取り直して進めていきたいと思います!
というわけで、やってきたことを思い出しながら!今日もインターバルタイマーの作成に向けて頑張っていきます!
今回は、このアプリにおけるめっちゃ大事な機能である、タイマー処理をやっていきます!難しそう…
今回からは僕自身の力では足りないと思いますので、GoogleAIのGeminiさんにお越しいただいて、協力いただきながら進めていきます。
よろしくお願いします。
では、やっていきましょう!
※この記事は前回からの続きです。レイアウトやID取得、intentによる画面遷移は前回で終了しております!
気になる方は前回の記事を確認いただけると嬉しいです!
前回記事はこちら
タイマー処理のための準備
では、やっていきます!
調べてみると、タイマー処理にはLong型というものを使用するらしい!
ということで、Long型で数値を使用していくのでstrからLongに変換し、ミリ秒にするために1000を乗算します。
そこで、EditTextに入力された値が数値に変換できるか判別するために条件式を追加します。この段階で型変換をしていこうと思います。
また、この条件式がfalseの場合、Toastでメッセージを出して修正してもらうようにします。
上記をGeminiさんに伝えて、少し変更したのが以下のコードになります。
//コピペの関係でインデントがおかしいです。あとで直すかも
//1)IDを取得する
val onTime:EditText = findViewById(R.id.onTime)
val offTime:EditText = findViewById(R.id.offTime)
val btnStart:Button = findViewById(R.id.btnStart)
//3)onTime,offTimeをLong型に変換
val onTimeString = onTime.text.toString()
val offTimeString = offTime.text.toString()
fun convertToLong(text:String):Long?{
return if(text.all {it.isDigit()}) {
text.toLong() * 1000
} else {
null
}
}
val onTimeLong: Long? = convertToLong(onTimeString)
val offTimeLong: Long? = convertToLong(offTimeString)
//2)intentを使用して画面遷移
btnStart.setOnClickListener {
//4)Long型であるか判別、falseならエラーメッセージ
if (onTimeLong == null || offTimeLong == null) {
Toast.makeText(this,"数字を入力してください",Toast.LENGTH_SHORT).show()
} else {
val intent = Intent(this,TimeActivity::class.java)
intent.putExtra("ON_TIME", onTimeLong)
intent.putExtra("OFF_TIME", offTimeLong)
}
// val intent = Intent(this,TimeActivity::class.java)
// intent.putExtra("ON_TIME",onTime.text.toString())
// intent.putExtra("OFF_TIME",offTime.text.toString())
// startActivity(intent)
}
書いたので確認のために実行!してみたらEditTextに数字を入力してスタートボタンを押すと、アプリが強制終了してしまいました。
Geminiさんに聞いてみると、「Logcatでエラーを探してみるといい」と言われたので探してみると、赤文字のメッセージがありました。
FATAL EXCEPTION: main
Process: com.example.rehaviri, PID: 5957
java.lang.NumberFormatException: For input string: ""
at java.lang.Long.parseLong(Long.java:761)
at java.lang.Long.parseLong(Long.java:876)
at com.example.rehaviri.MainActivity.onCreate convertToLong(MainActivity.kt:34)
at com.example.rehaviri.MainActivity.onCreate$lambda$2(MainActivity.kt:51)
at com.example.rehaviri.MainActivity.$r8$lambda$sWf4muGufFfv0u0Qgz6Ag8Glw6Y(Unknown Source:0)
at com.example.rehaviri.MainActivity$$ExternalSyntheticLambda1.onClick(D8$$SyntheticClass:0)
at android.view.View.performClick(View.java:7659)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:1218)
at android.view.View.performClickInternal(View.java:7636)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:30156)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8177)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
これまたGeminiさんに聞いてみると、入力された文字列が空であると言われました。
自分の手を加えた覚えのあるところは
at com.example.rehaviri.MainActivity.onCreate convertToLong(MainActivity.kt:34)
at com.example.rehaviri.MainActivity.onCreate$lambda$2(MainActivity.kt:51)
このメッセージを見てみると、
51行目:
val onTimeLong: Long? = convertToLong(onTimeString)
このconvertToLong関数が
34行目:
fun convertToLong(text:String):Long?{
return if(text.all {it.isDigit()}) {
text.toLong() * 1000
} else {
null
}
}
ここから呼び出されて、この関数内でエラーが出ている。
ということが分かりました。
まとめると、convertToLong関数内で、文字列を数値に変換しようとした際に、その文字列が数値として認識できない!
というエラーが発生していることが分かりました。
まとめた結果、よく分からなくなったのでやり直すことにしました★
まとめ
★惨敗★でしたね。次回では一つずつ必要なものを書き出して、段階的に実装できるように進めていきたいと思います。 また、次回をスムーズに進めるために、使用する型や数値、設定方法など、事前に調べておきたいと思います。
次回は止まることなく進められますように!
それでは!