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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

2回答

803閲覧

Kotlinによる通知の実装

Hdjjnnn

総合スコア1

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

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

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

0クリップ

投稿2022/11/10 13:38

前提

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)

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

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

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

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

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

jimbe

2022/11/10 13:52

「通知」とは、 Notification では無く?
hoshi-takanori

2022/11/10 14:27

自分でループを回して毎秒時刻をチェックしてるようですが、電池の無駄なので一番やっちゃいけないやつですね…。
jimbe

2022/11/10 16:16

コンパイル通りませんね・・・。
guest

回答2

0

ベストアンサー

kotlin は不慣れなものでこちらも試行錯誤ですが、一応動作しています。

MainActivity.kt

kotlin

1import android.icu.util.Calendar 2import androidx.appcompat.app.AppCompatActivity 3import android.os.Bundle 4import android.os.Handler 5import android.os.Looper 6import android.widget.Button 7import android.widget.TextView 8import androidx.appcompat.app.AlertDialog 9 10class MainActivity : AppCompatActivity() { 11 companion object { 12 const val REQUESTKEY_TIMEPICKER = "selectTime" 13 } 14 15 override fun onCreate(savedInstanceState: Bundle?) { 16 super.onCreate(savedInstanceState) 17 setContentView(R.layout.activity_main) 18 19 val nowText = findViewById<TextView>(R.id.nowText) 20 val alarmText = findViewById<TextView>(R.id.alarmText) 21 22 supportFragmentManager.setFragmentResultListener(REQUESTKEY_TIMEPICKER, this, { requestLKey, result -> 23 val hour = result.getInt(TimePickerDialogFragment.RESULT_HOUR) 24 val minute = result.getInt(TimePickerDialogFragment.RESULT_MINUTE) 25 alarmText.text = "%d時%2d分".format(hour, minute) 26 }) 27 28 val btnSelectTime = findViewById<Button>(R.id.btnSelectTime) 29 btnSelectTime.setOnClickListener { 30 TimePickerDialogFragment.getInstance(REQUESTKEY_TIMEPICKER).show(supportFragmentManager, null) 31 } 32 33 val handler = Handler(Looper.getMainLooper()) 34 class TimeDrawer : Runnable { 35 override fun run() { 36 val calendar = Calendar.getInstance() 37 val hour = calendar.get(Calendar.HOUR_OF_DAY) 38 val minute = calendar.get(Calendar.MINUTE) 39 val second = calendar.get(Calendar.SECOND) 40 nowText.text = "%d時%2d分".format(hour, minute) 41 if (alarmText.text == nowText.text) { 42 AlertDialog.Builder(this@MainActivity) 43 .setTitle("時間になりました!") 44 .setPositiveButton("Hello", null) 45 .show() 46 } 47 handler.postDelayed(this, (60 - second) * 1000L) 48 } 49 } 50 handler.post(TimeDrawer()) 51 } 52}

res/layout/activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout 3 xmlns:android="http://schemas.android.com/apk/res/android" 4 xmlns:app="http://schemas.android.com/apk/res-auto" 5 xmlns:tools="http://schemas.android.com/tools" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <TextView 11 android:id="@+id/alarmText" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="Hello World!" 15 app:layout_constraintBottom_toTopOf="@id/nowText" 16 app:layout_constraintEnd_toEndOf="parent" 17 app:layout_constraintStart_toStartOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 <TextView 20 android:id="@+id/nowText" 21 android:layout_width="wrap_content" 22 android:layout_height="wrap_content" 23 android:text="Hello World!" 24 app:layout_constraintBottom_toTopOf="@id/btnSelectTime" 25 app:layout_constraintEnd_toEndOf="parent" 26 app:layout_constraintStart_toStartOf="parent" 27 app:layout_constraintTop_toBottomOf="@id/alarmText" /> 28 <Button 29 android:id="@+id/btnSelectTime" 30 android:layout_width="wrap_content" 31 android:layout_height="wrap_content" 32 android:text="SELECT TIME" 33 app:layout_constraintBottom_toBottomOf="parent" 34 app:layout_constraintEnd_toEndOf="parent" 35 app:layout_constraintStart_toStartOf="parent" 36 app:layout_constraintTop_toBottomOf="@id/nowText" /> 37</androidx.constraintlayout.widget.ConstraintLayout>

TimePickerDialogFragment.kt

kotlin

1import android.app.Dialog 2import android.app.TimePickerDialog 3import android.os.Bundle 4import androidx.fragment.app.DialogFragment 5import java.util.* 6 7class TimePickerDialogFragment private constructor() : DialogFragment() { 8 companion object { 9 @Suppress("unused") 10 private val TAG = TimePickerDialogFragment::class.java.simpleName 11 12 private const val ARGS_REQUESTKEY = "requestKey" 13 const val RESULT_HOUR = "hour" 14 const val RESULT_MINUTE = "minute" 15 16 fun getInstance(requestKey: String) : TimePickerDialogFragment { 17 return TimePickerDialogFragment().apply { 18 arguments = Bundle().apply { 19 putString(ARGS_REQUESTKEY, requestKey) 20 } 21 } 22 } 23 } 24 25 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 26 val requestKey = arguments?.getString(ARGS_REQUESTKEY) 27 if(requestKey == null) throw IllegalArgumentException("no ${ARGS_REQUESTKEY} in args") 28 29 val calendar = Calendar.getInstance() 30 return TimePickerDialog(context, { timePicker, hour, minute -> 31 parentFragmentManager.setFragmentResult(requestKey, Bundle().apply { 32 putInt(RESULT_HOUR, hour) 33 putInt(RESULT_MINUTE, minute) 34 }) 35 }, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), true) 36 } 37}

エミュレータスクリーンショット「時間になりました」

投稿2022/11/11 09:21

編集2022/11/11 09:32
jimbe

総合スコア12632

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

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

Hdjjnnn

2022/11/13 13:17

回答ありがとうございます。 私も動作することができました。 ありがとうございました。
guest

0

Time

1Time(h, m, s) = 3600h + 60m + s

投稿2022/11/10 19:18

atcoderyellow

総合スコア481

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問