Avatar ·

Ошибка "Unresolved reference: kotlinx" при импорте kotlinx.android.synthetic в Android Studio

Всем привет! Я новичок в Kotlin и Android-разработке. Перехожу с Java, и пытаюсь использовать kotlinx.android.synthetic для упрощения работы с View в Activity. У меня Android Studio 4.2, проект на Kotlin. Я создал простую Activity с TextView: ```kotlin package com.example.myapp import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import kotlinx.android.synthetic.main.activity_main.* // <- здесь ошибка class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) myTextView.text = "Hello from Kotlin!" // myTextView - ID из XML } } ``` Но студия подчёркивает импорт красным и пишет: "Unresolved reference: kotlinx". При компиляции получаю ту же ошибку. Я уже проверил: 1. В build.gradle (app-level) у меня есть `apply plugin: 'kotlin-android-extensions'`. 2. В build.gradle (project-level) подключен плагин Kotlin: `classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21"`. 3. Gradle sync проходит без ошибок. 4. В манифесте Activity зарегистрирована. Я гуглил, но большинство ответов старые (2017-2019). Может быть, в новых версиях что-то изменилось? Как правильно импортировать kotlinx.android.synthetic? Или это вообще deprecated? Буду благодарен за подробное объяснение. <<>>

Почему возникает ошибка "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-файла и работает без дополнительных плагинов.

Шаги:

  1. В файле build.gradle (Module: app) включите View Binding:
android {
    ...
    buildFeatures {
        viewBinding = true
    }
}
  1. Удалите строку apply plugin: 'kotlin-android-extensions' из build.gradle.
  2. Измените вашу 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 (не путать с синтетикой).

Для этого:

  1. Удалите строку apply plugin: 'kotlin-android-extensions' из build.gradle.
  2. Удалите импорт import kotlinx.android.synthetic.main.activity_main.*.
  3. В 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+.