前提
kotlinで目覚ましアプリを作ろうとしています。
現在時刻の取得と時刻の設定はできました。
実現したいこと
現在時刻と設定した時刻が一致したら、「時間になりました」のような通知が行くようにしたいと思っています。
発生している問題・エラーメッセージ
設定した時刻になっても、なにも通知が来ません。
該当のソースコード
MainActivity.kt
kotlin
1package com.example.setect_time 2 3import android.icu.util.Calendar 4import androidx.appcompat.app.AppCompatActivity 5import android.os.Bundle 6import android.os.Handler 7import android.os.Looper 8import android.widget.Button 9import android.widget.TextView 10import android.icu.util.TimeZone 11import androidx.appcompat.app.AlertDialog 12import kotlin.concurrent.timer 13 14class MainActivity : AppCompatActivity(), TimePickerDialogFragment.OnSelectedTimeListener { 15 override fun onCreate(savedInstanceState: Bundle?) { 16 super.onCreate(savedInstanceState) 17 setContentView(R.layout.activity_main) 18 19 val tvTime=findViewById<TextView>(R.id.tvTime) 20 **ボールドテキスト**val timeTextView=findViewById<TextView>(R.id.tv) 21 22 timer(period = 1000){ 23 val calendar=Calendar.getInstance() 24 val tz=TimeZone.getTimeZone("Asia/Tokyo") 25 calendar.timeZone=tz 26 27 val hour=calendar.get(Calendar.HOUR_OF_DAY) 28 val minute=calendar.get(Calendar.MINUTE) 29 //val second=calendar.get(Calendar.SECOND) 30 31 val handler=Handler(Looper.getMainLooper()) 32 handler.post(){ 33 if(0<=minute&&minute<=9){ 34 tvTime.text = "${hour}時0${minute}分" 35 }else{ 36 tvTime.text = "${hour}時${minute}分" 37 } 38 if(timeTextView.text==tvTime.text){ 39 AlertDialog.Builder(this@MainActivity) 40 .setTitle("時間になりました!") 41 .setPositiveButton("Hello",null) 42 .show() 43 } 44 } 45 46 val btnSelectTime=findViewById<Button>(R.id.btnSelectTime) 47 btnSelectTime.setOnClickListener { 48 showTimePickerDialog() 49 } 50 51 } 52 53 private fun showTimePickerDialog() { 54 val timePickerDialogFragment = TimePickerDialogFragment() 55 timePickerDialogFragment.show(supportFragmentManager, null) 56 } 57 58 override fun selectedTime(hour: Int, minute: Int) { 59 60 val timeTextView=findViewById<TextView>(R.id.tv) 61 val tvTime=findViewById<TextView>(R.id.tvTime) 62 63 if(0<=minute&&minute<=9){ 64 timeTextView.text = "${hour}時0${minute}分" 65 }else{ 66 timeTextView.text = "${hour}時${minute}分" 67 } 68 } 69} 70
TimePickerFragment.kt
kotlin
1import android.app.Dialog 2import android.app.TimePickerDialog 3import android.content.Context 4import android.os.Bundle 5import android.widget.TimePicker 6import androidx.fragment.app.DialogFragment 7import java.util.* 8 9class TimePickerDialogFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener { 10 // Activity や Fragment に選択結果を渡すためのリスナー 11 interface OnSelectedTimeListener { 12 13 fun selectedTime(hour: Int, minute: Int) 14 } 15 16 private lateinit var listener: OnSelectedTimeListener 17 18 override fun onAttach(context: Context) { 19 super.onAttach(context) 20 if (context is OnSelectedTimeListener) { 21 listener = context 22 } 23 } 24 25 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 26 val calendar = Calendar.getInstance() 27 calendar.timeInMillis = Date().time 28 val context = context // smart cast 29 return when { 30 context != null -> { 31 TimePickerDialog( 32 context, 33 this, // ここでは TimePickerDialog の リスナーを渡す 34 calendar.get(Calendar.HOUR_OF_DAY), 35 calendar.get(Calendar.MINUTE), 36 true) 37 } 38 else -> super.onCreateDialog(savedInstanceState) 39 } 40 } 41 // TimePickerDialog から選択結果が渡される。 42 override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) { 43 listener.selectedTime(hourOfDay, minute) 44 } 45 46 companion object { 47 @Suppress("unused") 48 private val TAG = TimePickerDialogFragment::class.java.simpleName 49 } 50}
試したこと
どこのコードの部分を改善したら、通知が来るようになるでしょうか?
また、他にこのようにしたほうが良いなど意見がございましたらよろしくお願いします。
補足情報(FW/ツールのバージョンなど)
API:31
Android 12.0(s)
回答2件
あなたの回答
tips
プレビュー