Android StudioでKotlinコードを記述していると、
「Unresolved reference」というエラーが表示されることがあります。
このエラーは、Kotlinがコード内で指定されたクラス、関数、変数、プロパティなどを見つけられない場合に発生します。
原因としては、単純なスペルミスだけでなく、import文の不足、
Gradleの依存関係の不足、スコープの問題、
Android StudioやGradleの同期不良など、さまざまなものがあります。
この記事では、Android StudioでKotlinの
「Unresolved reference」が表示された場合に確認したい主な原因と、
基本的な解決方法を紹介します。
- 「Unresolved reference」とは
- 原因1:名前やスペルが間違っている
- 原因2:import文が不足している
- 原因3:変数や関数がスコープの外にある
- 原因4:Gradleの依存関係が不足している
- 原因5:Gradle Syncが正常に完了していない
- 原因6:ライブラリやAPIのバージョンが変わっている
- 原因7:パッケージ名が正しくない
- 原因8:JavaとKotlinのコードを混在させている
- 原因9:View BindingやData Bindingの設定に問題がある
- 原因10:Jetpack Composeのimportや依存関係に問題がある
- Android Studio上では赤字だがビルドできる場合
- Clean Project・Rebuild Projectを試す
- キャッシュの問題を確認する
- 大量の「Unresolved reference」が表示された場合
- 「Unresolved reference」が出たときの確認順序
- エラーメッセージの対象を確認する
- まとめ
「Unresolved reference」とは
Kotlinの「Unresolved reference」は、
コード内で参照している名前をコンパイラが解決できないことを示すエラーです。
例えば、次のようなコードがあるとします。
val message = "Hello"
println(mesage)
変数として定義されているのは
messageですが、
mesageと記述しているため、
Kotlinは該当する変数を見つけることができません。
このような場合、
mesageの部分に
「Unresolved reference」と表示されます。
「Unresolved reference」は特定の1つの原因だけで発生するエラーではありません。
エラーが表示されている名前が、どこで定義され、どのように読み込まれる予定なのかを確認することが重要です。
原因1:名前やスペルが間違っている
最初に確認したいのが、
クラス名、関数名、変数名などの入力ミスです。
Kotlinでは大文字と小文字も区別されます。
val userName = "Taro"
println(username)
この例では、
userNameと
usernameは別の名前として扱われます。
正しくは次のように記述します。
val userName = "Taro"
println(userName)
「Unresolved reference」が表示された場合は、
まず該当箇所のスペル、大文字・小文字、単数形・複数形などを確認します。
原因2:import文が不足している
使用しているクラスや関数が別のパッケージに存在する場合、
必要なimport文が記述されていないと
「Unresolved reference」が発生することがあります。
Android Studioでは、エラーになっているクラス名などにカーソルを合わせ、
クイックフィックスからimportを追加できる場合があります。
import android.widget.Toast
例えば
Toastを使用する場合、
適切なimportが必要です。
Android Studioで候補が表示される場合は、
Macでは一般的に
Option + Enterから修正候補を確認できます。
同じ名前のクラスが複数のパッケージに存在する場合があります。
自動importを使用するときも、意図したパッケージが選択されているか確認してください。
原因3:変数や関数がスコープの外にある
Kotlinでは、変数や関数を使用できる範囲が決まっています。
定義されたスコープの外側から参照すると、
「Unresolved reference」が発生します。
fun sample() {
val text = "Hello"
}
fun test() {
println(text)
}
この例の
textは
sample()の中で定義されたローカル変数です。
そのため、
別の関数である
test()から直接参照することはできません。
必要に応じて、クラスのプロパティとして定義したり、
関数の引数として値を渡したりする必要があります。
原因4:Gradleの依存関係が不足している
外部ライブラリやAndroidXなどの機能を使用している場合、
必要なライブラリがGradleに追加されていないことで
「Unresolved reference」が表示されることがあります。
例えば、あるライブラリのクラスをコード内で使用していても、
アプリ側の
build.gradleまたは
build.gradle.ktsに依存関係が存在しなければ、
Kotlinからそのクラスを参照できません。
dependencies {
implementation("ライブラリの依存関係")
}
ライブラリを追加した場合は、
Gradle Syncを実行してプロジェクトへ反映します。
インターネット上の記事から依存関係をコピーした場合、
ライブラリのバージョンやGradleの記述形式が現在のプロジェクトと合っていない場合があります。
Groovy DSLとKotlin DSLの違いにも注意してください。
原因5:Gradle Syncが正常に完了していない
Gradleの設定自体が正しくても、
Gradle Syncが正常に完了していないと、
Android Studioが依存関係を正しく認識できないことがあります。
特に、ライブラリを追加した直後や
Gradle関連ファイルを変更した直後に
「Unresolved reference」が大量に表示された場合は、
Gradle Syncの状態を確認します。
Android Studioのメニューから
Gradleファイルとの同期を実行し、
Sync中に別のエラーが発生していないか確認してください。
Gradle Sync自体が失敗している場合は、
「Unresolved reference」より先に、
Gradle側のエラーを解決する必要があります。
原因6:ライブラリやAPIのバージョンが変わっている
古いサンプルコードを使用したときに、
現在利用しているライブラリではクラス名や関数名が変更・削除されており、
「Unresolved reference」になることがあります。
この場合、スペルやimportが正しくてもエラーは解消しません。
使用しているライブラリのバージョンを確認し、
そのバージョンに対応するAPIや公式ドキュメントを確認します。
数年前の記事やサンプルコードでは、
現在とは異なるAndroid APIやライブラリが使用されていることがあります。
コードだけでなく、使用されているライブラリのバージョンも確認すると原因を特定しやすくなります。
原因7:パッケージ名が正しくない
自分で作成したクラスを別ファイルから参照している場合は、
パッケージ名も確認します。
ファイルを移動したり、
パッケージ構成を変更したりしたあとに、
package宣言やimport文が正しく更新されていないことがあります。
package com.example.sample
参照したいクラスがどのパッケージに所属しているかを確認し、
import先と一致しているか確認してください。
原因8:JavaとKotlinのコードを混在させている
Androidプロジェクトでは、
JavaとKotlinを同じプロジェクト内で使用することもできます。
ただし、Java側のメソッドやフィールドの定義方法によっては、
Kotlinから想定した名前で参照できない場合があります。
Javaで作成したクラスをKotlinから利用している場合は、
Java側でクラスやメソッドが適切に公開されているか、
パッケージやimportが正しいかを確認します。
原因9:View BindingやData Bindingの設定に問題がある
View BindingやData Bindingを利用している場合、
Bindingクラスに対して
「Unresolved reference」が表示されることがあります。
View Bindingの場合は、
モジュール側の設定でView Bindingが有効になっているか確認します。
android {
buildFeatures {
viewBinding = true
}
}
設定を変更したあとはGradle Syncを実行します。
また、生成されるBindingクラス名は
XMLレイアウトファイル名をもとに決まります。
activity_main.xml
↓
ActivityMainBinding
XMLファイル名を変更した場合などは、
コード側で使用しているBindingクラス名も確認してください。
原因10:Jetpack Composeのimportや依存関係に問題がある
Jetpack Composeを使用しているプロジェクトでも、
Compose関連の関数に
「Unresolved reference」が表示されることがあります。
例えば、
Text、
Column、
Modifierなどが解決できない場合は、
対応するimportやCompose関連の依存関係を確認します。
Composeのサンプルコードでは複数のライブラリに同名・類似名のAPIが存在することもあるため、
Android Studioが自動的に追加したimportが正しいか確認することも重要です。
Android Studio上では赤字だがビルドできる場合
まれに、コード自体には問題がなく、
Android Studioのエディタ上だけで
「Unresolved reference」のような赤いエラー表示が残ることがあります。
この場合は、実際にプロジェクトをビルドして、
コンパイルエラーが発生するか確認します。
ビルドできるにもかかわらずエディタの表示だけがおかしい場合は、
Android Studio側のインデックスやキャッシュが正常に更新されていない可能性があります。
Android Studioを再起動したり、
Gradle Syncを再実行したりすることで改善する場合があります。
Clean Project・Rebuild Projectを試す
コードやGradleの設定に明らかな問題が見つからない場合は、
プロジェクトの再ビルドも確認方法の1つです。
Android Studioのバージョンによってメニュー構成は異なりますが、
CleanやRebuildに相当する操作を行うことで、
以前生成されたビルド結果の影響を取り除ける場合があります。
ただし、
「Unresolved reference」の原因がスペルミスや依存関係不足の場合、
CleanやRebuildだけでは解決しません。
キャッシュの問題を確認する
Android Studioの内部状態やインデックスに問題が起きている場合、
正しいコードでも参照を解決できないように見える場合があります。
Gradle SyncやAndroid Studioの再起動でも改善せず、
コードや依存関係にも問題が見つからない場合は、
IDEのキャッシュやインデックスの問題を疑います。
キャッシュ関連の操作は最初から行うのではなく、
スペル、import、スコープ、Gradle Sync、依存関係などを確認したあとに試す方が、
本来の原因を特定しやすくなります。
大量の「Unresolved reference」が表示された場合
1か所だけではなく、
プロジェクト全体で突然大量の
「Unresolved reference」が表示された場合は、
個々のスペルミスよりもプロジェクト設定を疑った方がよい場合があります。
特に確認したいのは、
Gradle Syncの失敗、
build.gradleまたはbuild.gradle.ktsのエラー、
プラグインの問題、
ライブラリ取得の失敗などです。
Gradleにエラーがあると依存関係を正しく読み込めず、
本来利用できるはずの多数のクラスがまとめて
「Unresolved reference」になることがあります。
「Unresolved reference」が出たときの確認順序
原因が分からない場合は、
次の順番で確認すると切り分けやすくなります。
- エラー箇所のスペルと大文字・小文字を確認する
- 対象の変数・関数・クラスが実際に定義されているか確認する
- import文を確認する
- 変数や関数のスコープを確認する
- 必要なライブラリがGradleに追加されているか確認する
- Gradle Syncが成功しているか確認する
- 使用しているライブラリとサンプルコードのバージョンを確認する
- パッケージ名やファイル構成を確認する
- プロジェクトを再ビルドする
- Android Studioを再起動し、必要に応じてキャッシュやインデックスを確認する
エラーメッセージの対象を確認する
「Unresolved reference」を解決するときは、
エラー名だけではなく、
何がUnresolved referenceになっているのかを確認することが重要です。
例えば、
自分で作成した変数が対象ならスペルやスコープ、
Androidのクラスならimport、
外部ライブラリのクラスならGradleの依存関係、
BindingクラスならView Bindingの設定というように、
対象によって確認すべき場所が変わります。
例:
Unresolved reference: Toast
→ importを確認
Unresolved reference: ActivityMainBinding
→ View Bindingとレイアウトファイル名を確認
Unresolved reference: userName
→ 変数名やスコープを確認
外部ライブラリのクラスがUnresolved reference
→ GradleのdependenciesとSyncを確認
まとめ
Android StudioのKotlinで表示される
「Unresolved reference」は、
コードから参照しようとしているクラス、関数、変数などを
Kotlinが見つけられない場合に発生するエラーです。
原因として特に多いのは、
スペルミス、import不足、スコープの問題、
Gradleの依存関係不足、Gradle Syncの失敗などです。
1か所だけで発生している場合は、
まず名前、import、スコープを確認します。
一方、プロジェクト全体で大量に発生している場合は、
Gradleやプロジェクト設定に問題がないか確認すると原因を絞り込みやすくなります。
また、古いサンプルコードを利用している場合は、
現在使用しているライブラリのバージョンで同じAPIが利用できるか確認することも重要です。
