🥶

Android Kotlinで「あれ?こんな関数が見つからない」となったら

2022/10/10に公開

Intent のページを見てたら「あれ?この関数や変数が見つからないけど IDE のサジェストにも出てこないぞ...なぜだ?」となったのでその時の解決した方法をアウトプットします。

原因 : グローバル変数かと思ったらフィールドだった!

例えばこのページの「インテントの例:」のコードをコピペしてもJetpackCompose の関数内では packageManager や startActivity が見つからない旨のエラーが出てしまいます。

はじめはpackageManagerという変数をどこかで定義しているのかなとも思いましたが、そのような話のくだりはドキュメントにはなく、路頭に迷いました。
そしてこの変数が果たして「(グローバル)変数なのだろうか?」と疑ったことで解決しました。
そうです。packageManagerは変数ではなく、あるクラスのフィールド変数だったのです。

今回は Intent のドキュメントだったので「Activity かなー」と直感を信じたらたまたまヒットして見事 Activity クラス(の親の Context クラス)にpackageManagerstartActivityを発見することができました。
上記のコードは 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