🥶
Android Kotlinで「あれ?こんな関数が見つからない」となったら
Intent のページを見てたら「あれ?この関数や変数が見つからないけど IDE のサジェストにも出てこないぞ...なぜだ?」となったのでその時の解決した方法をアウトプットします。
原因 : グローバル変数かと思ったらフィールドだった!
例えばこのページの「インテントの例:」のコードをコピペしてもJetpackCompose の関数内では packageManager や startActivity が見つからない旨のエラーが出てしまいます。
はじめはpackageManager
という変数をどこかで定義しているのかなとも思いましたが、そのような話のくだりはドキュメントにはなく、路頭に迷いました。
そしてこの変数が果たして「(グローバル)変数なのだろうか?」と疑ったことで解決しました。
そうです。packageManager
は変数ではなく、あるクラスのフィールド変数だったのです。
今回は Intent のドキュメントだったので「Activity かなー」と直感を信じたらたまたまヒットして見事 Activity クラス(の親の Context クラス)にpackageManager
とstartActivity
を発見することができました。
上記のコードは Activity クラスのメソッドとして定義される前提があったようです。
ちなみに上記のコードを Compose で使えるようにするための修正版は以下の通りです。
+ fun createAlarm(message: String, hour: Int, minutes: Int, context: Context) {
val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply {
putExtra(AlarmClock.EXTRA_MESSAGE, message)
putExtra(AlarmClock.EXTRA_HOUR, hour)
putExtra(AlarmClock.EXTRA_MINUTES, minutes)
}
+ if (intent.resolveActivity(context.packageManager) != null) {
+ context.startActivity(intent)
}
}
まとめ
あれ?こんな変数(or 関数)なんてないぞ、と思ったら他クラス(特に Context クラス)のメンバじゃないかチェックしてみます...
Discussion