Ошибка "Unresolved reference: kotlinx" при импорте kotlinx.android.synthetic в Android Studio
Почему возникает ошибка "Unresolved reference: kotlinx"?
Вы столкнулись с типичной ситуацией для разработчиков, которые используют современные версии Kotlin (1.4.20+). Начиная с Kotlin 1.8.0 (и особенно после выхода Kotlin 2.0), плагин kotlin-android-extensions, который предоставлял синтетические импорты (kotlinx.android.synthetic), был официально объявлен устаревшим (deprecated) и удалён из стандартной поставки плагина Kotlin Gradle Plugin.
Вот почему ваш код не работает:
- Плагин удалён — в новых версиях Kotlin (1.9+, 2.0+) плагин
kotlin-android-extensionsбольше не входит в составkotlin-gradle-plugin. Даже если вы укажетеapply plugin: 'kotlin-android-extensions', Gradle его не найдёт, так как он физически отсутствует. - Рекомендуемая альтернатива — Google и JetBrains рекомендуют использовать View Binding или Jetpack Compose вместо синтетических импортов. View Binding — это более безопасный и поддерживаемый способ.
Решение 1: Полный переход на View Binding (рекомендуется)
Это самый правильный способ для новых проектов. View Binding генерирует классы привязки для каждого XML-файла и работает без дополнительных плагинов.
Шаги:
- В файле
build.gradle (Module: app)включите View Binding:
android {
...
buildFeatures {
viewBinding = true
}
}
- Удалите строку
apply plugin: 'kotlin-android-extensions'из build.gradle. - Измените вашу Activity:
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.example.myapp.databinding.ActivityMainBinding // автоматически сгенерированный класс
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// Теперь используем binding вместо синтетики
binding.myTextView.text = "Hello from ViewBinding!"
}
}
После этого сделайте Clean Project (Build → Clean Project) и Rebuild Project.
Решение 2: Если вы временно хотите оставить синтетику (не рекомендуется)
Вы можете установить конкретную версию плагина, которая ещё содержит kotlin-android-extensions. Например, используйте Kotlin 1.6.21 (последняя версия, где плагин работал стабильно).
В build.gradle (project-level):
buildscript {
ext.kotlin_version = '1.6.21'
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
Затем в build.gradle (app-level):
apply plugin: 'kotlin-android-extensions'
android {
// ...
}
После синхронизации Gradle импорт kotlinx.android.synthetic.main.activity_main.* заработает. Но учтите: это временное решение — в будущем вам придётся мигрировать.
Почему View Binding лучше?
- Безопасность типов — binding генерирует строго типизированные ссылки на View.
- Null-безопасность — нет риска получить null из-за несовпадения ID.
- Поддержка — View Binding активно поддерживается Google, синтетика — мертва.
- Производительность — binding работает быстрее, так как генерирует код на этапе компиляции.
Альтернативный подход: Использование findViewById с Kotlin Extensions (упрощённый вариант)
Если вы не хотите внедрять View Binding целиком, но и не можете обновить Kotlin, вы можете просто отказаться от импорта kotlinx.android.synthetic и использовать классический findViewById с помощью Kotlin Android Extensions (не путать с синтетикой).
Для этого:
- Удалите строку
apply plugin: 'kotlin-android-extensions'из build.gradle. - Удалите импорт
import kotlinx.android.synthetic.main.activity_main.*. - В Activity используйте
findViewById:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val myTextView: TextView = findViewById(R.id.myTextView)
myTextView.text = "Hello!"
}
}
Этот подход работает в любой версии Kotlin и не требует дополнительных плагинов. Однако он многословен и неудобен при большом количестве View. Для небольших проектов — приемлемо, но для серьёзной разработки я всё же рекомендую View Binding.
Также обратите внимание: если вы используете Kotlin 1.8+ и всё ещё хотите синтетику, можно добавить в build.gradle зависимость:
dependencies {
implementation "org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.6.21"
}
Но это лишь отсрочит неизбежное — Google уже удалил этот плагин из Android Gradle Plugin 8.0+.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги