🥶

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

2022/10/10に公開約1,300字

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

ログインするとコメントできます