回答
実際に動作するアプリを用意いたしましたので、こちらをご確認していただけると早いかもしれません。
https://github.com/blendthink/TimePickerDemo
ただ、これでは分かりづらいと思いますので、回答までの道筋を記載いたします。
回答までの道筋
※ おそらく手順2までは理解されているかと思いますが、他の方がこの質問をみたときの参考のために記載しておきます。
1. 発生している例外のメッセージを読みます
Type mismatch: inferred type is MainActivity? but TimePickerDialog.OnTimeSetListener! was expected
↓
型の不一致: 推測された型は MainActivity? 型でしたが、TimePickerDialog.OnTimeSetListener! 型が期待されていました
どうやら TimePickerDialog のコンストラクタ引数に渡されている型が異なることが問題のようです。
2. TimePickerDialog のコンストラクタ引数に渡しているものを確認
TimePickerDialog(activity, activity as MainActivity?, hour, minute, true)
現在、activity as MainActivity? を渡していますが、TimePickerDialog の第2引数には OnTimeSetListener 型の値を渡さなければなりません。
公式ドキュメント
https://developer.android.com/reference/android/app/TimePickerDialog
3. どうやって OnTimeSetListener 型の値を渡すか
OnTimeSetListener は interface なので、OnTimeSetListener を実装しているクラスのインスタンスは OnTimeSetListener にキャストすることができます。
現在、TimePickerDialogFragment に OnTimeSetListener が実装されていますので、this を渡してあげると自動的に OnTimeSetListener キャストされ、いま出ているエラーは発生しなくなります。
kotlin:TimePickerDialogFragment.kt
1package com.example.alarmapp
2
3import android.app.Activity
4import android.app.Dialog
5import android.app.TimePickerDialog
6import android.app.TimePickerDialog.OnTimeSetListener
7import android.os.Bundle
8import android.util.Log
9import android.widget.TimePicker
10import androidx.fragment.app.DialogFragment
11import java.util.*
12
13
14class TimePickerDialogFragment : DialogFragment(), OnTimeSetListener {
15 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
16 val c = Calendar.getInstance()
17 val hour = c[Calendar.HOUR_OF_DAY]
18 val minute = c[Calendar.MINUTE]
19 return TimePickerDialog(activity, this, hour, minute, true)
20 }
21
22 override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) {
23 // ダイアログの OK を押すと設定されている値がログに表示される(onTimeSet で絞り込むと早く見つけられます)
24 Log.d("onTimeSet", "hourOfDay: $hourOfDay, minute: $minute")
25 }
26}
ただ、これでは MainActivity に値を渡せていません。
4. MainActivity に値を渡すためにどうするか
TimePickerDialogFragment ではなく MainActivity に OnTimeSetListener を実装するように修正します。
kotlin:MainActivity.kt
1package com.example.alarmapp
2
3import android.app.TimePickerDialog.OnTimeSetListener
4import android.os.Bundle
5import android.util.Log
6import android.widget.Button
7import android.widget.TextView
8import android.widget.TimePicker
9import androidx.appcompat.app.AppCompatActivity
10
11
12class MainActivity : AppCompatActivity(), OnTimeSetListener {
13 override fun onCreate(savedInstanceState: Bundle?) {
14 super.onCreate(savedInstanceState)
15 setContentView(R.layout.activity_main)
16
17 val button = findViewById<Button>(R.id.button_show_dialog) ?: return
18 button.setOnClickListener {
19 TimePickerDialogFragment().show(supportFragmentManager, TimePickerDialogFragment.TAG)
20 }
21 }
22
23 override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) {
24 // ダイアログの OK を押すと設定されている値がログに表示される(onTimeSet で絞り込むと早く見つけられます)
25 Log.d("onTimeSet", "hourOfDay: $hourOfDay, minute: $minute")
26 }
27}
kotlin:TimePickerDialogFragment.kt
1package com.example.alarmapp
2
3import android.app.Dialog
4import android.app.TimePickerDialog
5import android.app.TimePickerDialog.OnTimeSetListener
6import android.content.Context
7import android.os.Bundle
8import androidx.fragment.app.DialogFragment
9import java.util.*
10
11
12class TimePickerDialogFragment : DialogFragment() {
13
14 private lateinit var listener: OnTimeSetListener
15
16 override fun onAttach(context: Context) {
17 super.onAttach(context)
18 try {
19 listener = context as OnTimeSetListener
20 } catch (e: ClassCastException) {
21 throw ClassCastException("$context must implement OnTimeSetListener")
22 }
23 }
24
25 override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
26 val c = Calendar.getInstance()
27 val hour = c[Calendar.HOUR_OF_DAY]
28 val minute = c[Calendar.MINUTE]
29 return TimePickerDialog(activity, listener, hour, minute, true)
30 }
31}
最後に
公式のダイアログのドキュメントが丁寧に記載されているため、もしかするとより深い理解の助けになるかもしれません。
https://developer.android.com/guide/topics/ui/dialogs?hl=ja
もし不明点などあれば、いつでもご質問していただけたらと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/21 20:37