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

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

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

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

Android Studio

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

Kotlin

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

解決済

Kotlinによる通知の実装

Hdjjnnn
Hdjjnnn

総合スコア1

Android

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

Android Studio

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

Kotlin

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

2回答

0グッド

0クリップ

250閲覧

投稿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)

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jimbe

2022/11/10 13:52

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

2022/11/10 14:27

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

2022/11/10 16:16

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

回答2

1

ベストアンサー

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

総合スコア10757

spoofy_dragon👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

Hdjjnnn

2022/11/13 13:17

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

1

Time

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

投稿2022/11/10 19:18

atcoderyellow

総合スコア481

退会済みユーザー👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2022/11/11 15:51

こちらの回答が複数のユーザーから「説明が不足している回答」という指摘を受けました。

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Android

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

Android Studio

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

Kotlin

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