はじめてのAndroidプログラミング第4版という書籍でAndroidStudioとKotlinを勉強し始めたところです.
現在アラームが完成したところです.
これを応用して日時を複数設定できるアラームを作成したく,挑戦しています.
進行状況は,アクティビティを複数作成し,各アクティビティに1つアラームをセットしています.各アクティビティのアラームは異なる動きをするようになっています.(ダイアログを表示し,OKと次回もという画面を表示し,次回もを押すと1週間後にアラームが再セットされるもの,2週間後にアラームがセットされるもの,1ヶ月後にアラームがセットされるものといった感じです.)
以下のプログラムは複数あるアクティビティのうちの1つです.
実行したいことは以下の通りです.
アラートダイアログのメッセージを各日時によって変える
”月曜日です!”を,ほかのActivityのアラームでセットすると”第1週目の月曜日です!”と表示するようにしたいです.
現在はどのActivityから設定しても同じダイアログが表示される処理しかできません.
Kotlin
1 2 3 4@Suppress("UNREACHABLE_CODE", "DEPRECATION", "CAST_NEVER_SUCCEEDS", "PARAMETER_NAME_CHANGED_ON_OVERRIDE") 5class alarmActivity : AppCompatActivity(),TimeAlertDialog.Listener 6 ,DatePickerFragment.onDateSelectedListener 7 ,TimePickerFragment.OnTimeSelectedListener { 8 9 override fun getUp() { 10 finish() 11 } 12 13 14 override fun onSelected(year: Int, month: Int, date: Int) { 15 val c = Calendar.getInstance() 16 c.set(year, month, date) 17 dateText.setText(DateFormat.format("yyyy/MM/dd", c)) 18 } 19 20 @SuppressLint("SetTextI18n") 21 override fun onSelected(hourOfDay: Int, minute: Int) { 22 timeText.setText("%1$02d:%2$02d".format(hourOfDay,minute)) 23 24 } 25 26 override fun onPositiveClick() { 27 finish() 28 } 29 30 31 override fun snooze() { 32 val calendar = Calendar.getInstance() 33 calendar.timeInMillis = System.currentTimeMillis() 34 calendar.add(Calendar.DAY_OF_WEEK,7) 35 setAlarmManager(calendar) 36 finish() 37 } 38 39 40 override fun onCreate(savedInstanceState: Bundle?) { 41 super.onCreate(savedInstanceState) 42 43 if (intent?.getBooleanExtra("onReceive", false) == true) { 44 when { 45 Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1 -> { 46 setShowWhenLocked(true) 47 setTurnScreenOn(true) 48 val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager 49 keyguardManager.requestDismissKeyguard(this, null) 50 } 51 Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> { 52 window.addFlags( 53 FLAG_TURN_SCREEN_ON or FLAG_SHOW_WHEN_LOCKED 54 ) 55 val keyguardManager = 56 getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager 57 keyguardManager.requestDismissKeyguard(this, null) 58 } 59 else -> window.addFlags( 60 FLAG_TURN_SCREEN_ON or FLAG_SHOW_WHEN_LOCKED or FLAG_DISMISS_KEYGUARD 61 ) 62 } 63 64 val dialog = TimeAlertDialog() 65 dialog.show(supportFragmentManager, "alert_dialog") 66 } 67 68 setContentView(R.layout.activity_alarm) 69 70 setalarm.setOnClickListener { 71 val date = "${dateText.text} ${timeText.text}".toDate() 72 when { 73 date != null -> { 74 val calendar = Calendar.getInstance() 75 calendar.time = date 76 setAlarmManager(calendar) 77 Toast.makeText( 78 this, "アラームをセットしました", 79 Toast.LENGTH_SHORT 80 ).show() 81 } 82 else -> { 83 Toast.makeText( 84 this, "日付の形式が正しくありません", 85 Toast.LENGTH_SHORT 86 ).show() 87 } 88 } 89 } 90 91 cancelalarm.setOnClickListener { 92 cancelAlarmManager() 93 } 94 95 dateText.setOnClickListener { 96 val dialog = DatePickerFragment() 97 dialog.show(supportFragmentManager, "date_dialog") 98 } 99 timeText.setOnClickListener { 100 val dialog = TimePickerFragment() 101 dialog.show(supportFragmentManager, "time_dialog") 102 } 103 104 } 105 106 @SuppressLint("ObsoleteSdkInt") 107 private fun setAlarmManager(calendar: Calendar){ 108 val am = getSystemService(Context.ALARM_SERVICE) as AlarmManager 109 val intent = Intent(this,AlarmBroadcastReceiver::class.java) 110 val pending = PendingIntent.getBroadcast(this,0,intent,0) 111 112 113 114 when{ 115 Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP -> { 116 val info = AlarmManager.AlarmClockInfo(calendar.timeInMillis, null) 117 am.setAlarmClock(info,pending) 118 } 119 Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ->{ 120 am.setExact(AlarmManager.RTC_WAKEUP,calendar.timeInMillis,pending) 121 }else ->{ 122 am.set(AlarmManager.RTC_WAKEUP,calendar.timeInMillis,pending) 123 } 124 } 125 } 126 private fun cancelAlarmManager(){ 127 val am = getSystemService(Context.ALARM_SERVICE) as AlarmManager 128 val intent = Intent(this,AlarmBroadcastReceiver::class.java) 129 val pending = PendingIntent.getBroadcast(this,0,intent,0) 130 am.cancel(pending) 131 } 132 133 134 private fun String.toDate(pattern:String = "yyyy/MM/dd HH:mm"):Date?{ 135 return try { 136 SimpleDateFormat(pattern).parse(this) 137 }catch (e:IllegalArgumentException){ 138 return null 139 }catch (e:ParseException){ 140 return null 141 } 142 } 143}
Kotlin
1 2 3@Suppress("UNUSED_ANONYMOUS_PARAMETER") 4class TimeAlertDialog : DialogFragment(){ 5 6 interface Listener{ 7 fun getUp() 8 fun snooze() 9 fun onPositiveClick() 10 11 fun onSelected(year: Int, month: Int, date: Int) 12 13 } 14 private var listener:Listener? = null 15 16 override fun onAttach(context: Context) { 17 super.onAttach(context) 18 when (context){ 19 is Listener -> listener = context 20 } 21 } 22 23 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 24 val builder = AlertDialog.Builder(requireActivity()) 25 builder.setMessage("月曜日です!") 26 27 builder.setPositiveButton("OK"){dialog, which -> 28 listener?.getUp() 29 } 30 builder.setNegativeButton("次回も"){dialog,which -> 31 listener?.snooze() 32 } 33 return builder.create() 34 } 35} 36 37class DatePickerFragment : DialogFragment(),DatePickerDialog.OnDateSetListener{ 38 interface onDateSelectedListener{ 39 fun onSelected(year: Int,month:Int,date:Int) 40 } 41 private var listener: onDateSelectedListener? = null 42 43 override fun onAttach(context: Context) { 44 super.onAttach(context) 45 when(context){ 46 is onDateSelectedListener -> listener=context 47 } 48 } 49 50 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 51 //return super.onCreateDialog(savedInstanceState) 52 val c = Calendar.getInstance() 53 val year = c.get(Calendar.YEAR) 54 val month = c.get(Calendar.MONTH) 55 val date = c.get(Calendar.DAY_OF_MONTH) 56 return DatePickerDialog(requireActivity(),this,year,month,date) 57 58 } 59 override fun onDateSet(view:DatePicker?,year: Int,month: Int,dayOfMonth: Int){ 60 listener?.onSelected(year,month,dayOfMonth) 61 } 62} 63 64class TimePickerFragment : DialogFragment(),TimePickerDialog.OnTimeSetListener{ 65 interface OnTimeSelectedListener{ 66 fun onSelected(hourOfDay:Int,minute:Int) 67 } 68 69 private var listener : OnTimeSelectedListener? = null 70 71 override fun onAttach(context: Context) { 72 super.onAttach(context) 73 when(context){ 74 is OnTimeSelectedListener -> listener = context 75 } 76 } 77 78 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { 79 val c = Calendar.getInstance() 80 val hour = c.get(Calendar.HOUR_OF_DAY) 81 val minute = c.get(Calendar.MINUTE) 82 return TimePickerDialog(context,this,hour,minute,true) 83 } 84 85 override fun onTimeSet(View:TimePicker?,hourOfDay: Int,minute: Int) { 86 //TODO("not implemented") //To change body of created functions use File | Settings | File Templates. 87 listener?.onSelected(hourOfDay, minute) 88 } 89}
Kotlin
1package com.example.gomidashihome1 2 3import android.content.BroadcastReceiver 4import android.content.Context 5import android.content.Intent 6 7class AlarmBroadcastReceiver : BroadcastReceiver() { 8 9 override fun onReceive(context: Context, intent: Intent) { 10 // This method is called when the BroadcastReceiver is receiving an Intent broadcast. 11 //TODO("AlarmBroadcastReceiver.onReceive() is not implemented") 12 val mainIntent = Intent(context,alarmActivity::class.java) 13 .putExtra("onReceive",true) 14 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) 15 context.startActivity(mainIntent) 16 } 17}
Android初心者のため至らぬところばかりですが,何か教えて頂けると幸いです.
開発環境は
Android Studio3.4.1
Windows10
です.
あなたの回答
tips
プレビュー