Как добавить Kotlin в существующее приложение

Android Studio полностью поддерживает Kotlin, поэтому вы можете добавлять файлы Kotlin в существующий проект и конвертировать код Java в Kotlin. После этого вы сможете использовать все инструменты Android Studio для работы с кодом Kotlin, в том числе автозаполнение, проверку кода, рефакторинг, отладку и т. д.

Если вы начинаете новый проект и хотите использовать Kotlin, ознакомьтесь с разделом Как создать проект.

Примеры можно найти в разделе Примеры кода на Kotlin.

Как добавить Kotlin в существующий проект

Чтобы добавить Kotlin в проект, выполните следующие действия:

  1. Нажмите File > New (Файл > Создать) и выберите один из шаблонов Android, например пустой Fragment (Фрагмент), как показано на рисунке 1. Если в этом меню нет списка шаблонов, сначала откройте окно Проект и выберите модуль приложения.

    создать новый пустой фрагмент;
    Рисунок 1. Выберите один из доступных шаблонов, например fragment или activity.
  2. В появившемся мастере выберите Kotlin в качестве исходного языка. На рисунке 2 показано диалоговое окно New Android Activity (Новый объект activity для Android), которое используется при создании нового объекта activity.

    диалоговое окно, в котором можно выбрать Kotlin в качестве языка оригинала;
    Рисунок 2. Диалоговое окно New Android Activity (Новый объект activity для Android), в котором можно выбрать Kotlin в качестве Source Language (Исходный язык).
  3. Следуйте инструкциям мастера.

Вы также можете нажать File > New > Kotlin File/Class (Файл > Создать > Файл/класс Kotlin), чтобы создать базовый файл Kotlin. Если такого пункта нет, откройте окно Project и выберите каталог java. В окне New Kotlin File/Class (Новый файл/класс Kotlin) можно задать имя файла и выбрать его тип: File (Файл), Class (Класс), Interface (Интерфейс), Enum Class (Класс перечисления) или Object (Объект). От вашего выбора зависит, какой базовый каркас будет создан в новом файле Kotlin. Если вы выберете Class (Класс), Android Studio создаст новый исходный файл Kotlin с указанным именем и соответствующим определением класса. Если вы выберете Интерфейс, в файле будет объявлен интерфейс и т. д.

Если вы впервые добавляете в проект новый класс или файл Kotlin напрямую (не используя шаблоны Android), Android Studio покажет предупреждение о том, что Kotlin не настроен в проекте, как показано на рисунке 3. Настройте Kotlin, нажав Configure (Настроить) в правом верхнем углу редактора или в оповещении журнала событий, которое появится в правом нижнем углу.

диалоговое окно с предупреждением, в котором вам будет предложено настроить Kotlin для проекта;
Рисунок 3. Если в проекте не настроен Kotlin, в Android Studio появится диалоговое окно с предупреждением.

Когда появится запрос, выберите вариант настройки Kotlin для всех модулей, содержащих файлы Kotlin, как показано на рисунке 4:

настроить Kotlin для всех модулей, содержащих код Kotlin;
Рисунок 4. Выберите, нужно ли настроить Kotlin для всех модулей, содержащих код на этом языке.

После того как вы нажмете ОК, Android Studio добавит Kotlin в classpath проекта и применит плагин Kotlin Android к каждому модулю, содержащему файлы Kotlin. Ваши файлы build.gradle должны выглядеть примерно так, как показано ниже.

Яркий

// Project build.gradle file.
buildscript {
    ext.kotlin_version = '1.4.10'
    ...
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

Kotlin

// Project build.gradle.kts file.
buildscript {
    extra["kotlin_version"] = "1.4.10"
    ...
    dependencies {
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
    }
}

Яркий

// Inside each module using kotlin
plugins {
    ...
    id 'kotlin-android'
}

...

dependencies {
    implementation 'androidx.core:core-ktx:1.3.2'
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

Kotlin

// Inside each module using kotlin
plugins {
    ...
    kotlin("android")
}

...

val kotlin_version: String by rootProject.extra

dependencies {
    implementation("androidx.core:core-ktx:1.3.2")
    implementation("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version")
}

Исходная организация

По умолчанию новые файлы Kotlin сохраняются в каталоге src/main/java/, поэтому файлы Kotlin и Java можно легко найти в одном месте. Если вы хотите хранить файлы Kotlin отдельно от файлов Java, поместите их в папку src/main/kotlin/. Если вы это сделаете, то вам также нужно будет добавить этот каталог в конфигурацию sourceSets, как показано ниже:

Яркий

android {
    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }
}

Kotlin

android {
    sourceSets {
        getByName("main") {
            java.srcDir("src/main/kotlin")
        }
    }
}

Как преобразовать существующий код Java в код Kotlin

Чтобы преобразовать код Java в Kotlin, откройте файл Java в Android Studio и выберите Code > Convert Java File to Kotlin File (Код > Преобразовать файл Java в файл Kotlin). Вы также можете создать новый файл Kotlin (File > New > Kotlin File/Class) и вставить в него код Java. Android Studio предложит вам преобразовать код в Kotlin, как показано на рисунке 5. Нажмите Да, чтобы преобразовать файл. Вы также можете установить флажок Больше не показывать это диалоговое окно, чтобы конвертация выполнялась автоматически.

настроить Kotlin для всех модулей, содержащих код Kotlin;
Рисунок 5. Android Studio может конвертировать код Java в Kotlin.

Преобразование кода и допустимость значения NULL

В результате преобразования в Android Studio получается функционально эквивалентный код на Kotlin, который компилируется и выполняется. Однако, скорее всего, вам потребуется дополнительно оптимизировать преобразованный код. Например, вы можете изменить способ обработки типов, допускающих значение NULL, в преобразованном коде.

В Android принято откладывать инициализацию объектов View и других компонентов до тех пор, пока фрагмент или объект activity, к которому они прикреплены, не достигнет нужного состояния жизненного цикла. Например, в одном из фрагментов может быть ссылка на кнопку, как показано в следующем фрагменте кода:

public class JavaFragment extends Fragment {

    // Null until onCreateView.
    private Button button;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View root = inflater.inflate(R.layout.fragment_content, container,false);

        // Get a reference to the button in the view, only after the root view is inflated.
        button = root.findViewById(R.id.button);

        return root;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // Not null at this point of time when onViewCreated runs
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ...
            }
        });
    }
}

Хотя переменная кнопки может иметь нулевое значение, в этом примере она никогда не будет нулевой. Однако, поскольку его значение не присваивается при создании, сгенерированный код Kotlin обрабатывает Button как тип, допускающий значение null, и использует оператор утверждения о ненулевом значении, чтобы распаковать кнопку при добавлении прослушивателя кликов, как показано ниже:

class JavaFragment : Fragment() {

    // Null until onCreateView.
    private var button: Button? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?): View? {
        ...
        // Get a reference to the button in the view, only after the root view is inflated.
        button = root.findViewById(R.id.button)
        ...
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        // Not null at the point of time when onViewCreated fires 
        // but force unwrapped nonetheless
        button!!.setOnClickListener { }
    }
}

Такое преобразование менее удобно, чем использование lateinit, поскольку вам придется извлекать ссылку на кнопку с помощью оператора утверждения ненулевого значения или безопасного вызова в каждом месте, где она используется.

В других случаях, когда null является допустимым присваиванием переменной в соответствии с вариантом использования приложения, более подходящим способом безопасного извлечения объекта, допускающего значение NULL, или приведения к разумному значению по умолчанию, отличному от NULL, может быть использование оператора безопасного вызова (?.) с завершающим оператором Элвиса (?:). У Android Studio недостаточно информации, чтобы определить это во время преобразования. По умолчанию используется утверждение о ненулевом значении, но вам следует проверить и при необходимости изменить преобразованный код.

Дополнительная информация

Подробнее о том, как использовать в проекте код на Kotlin и Java, рассказывается в статье Как вызывать код Java из Kotlin.

Подробнее о том, как использовать Kotlin в корпоративных сценариях…

Чтобы узнать больше об идиоматических обертках Kotlin для существующих API Android, ознакомьтесь с Android KTX.