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

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

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

Примеры можно найти в наших примерах кода Kotlin .

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

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

  1. Нажмите «Файл» > «Новый» и выберите один из различных шаблонов Android, например новый пустой фрагмент , как показано на рисунке 1. Если вы не видите список шаблонов в этом меню, сначала откройте окно «Проект» и выберите свой модуль приложения.

    создать новый пустой фрагмент
    Рисунок 1. Выберите один из доступных шаблонов, например фрагмент или действие.
  2. В появившемся мастере выберите Kotlin в качестве исходного языка . На рис. 2 показано диалоговое окно «Новое действие Android» , когда вы хотите создать новое действие.

    диалоговое окно, позволяющее выбрать Kotlin в качестве исходного языка
    Рисунок 2. Диалоговое окно «Новое действие Android» , в котором вы можете выбрать Kotlin в качестве исходного языка .
  3. Продолжайте работу с мастером.

Альтернативно вы можете нажать «Файл» > «Создать» > «Файл/класс Kotlin», чтобы создать базовый файл Kotlin. Если вы не видите эту опцию, откройте окно проекта и выберите каталог Java . Окно «Новый файл/класс Kotlin» позволяет вам определить имя файла и предоставляет несколько вариантов выбора типа файла: File , Class , Interface , Enum Class или Object . Сделанный вами выбор определяет базовую структуру, созданную для вас в новом файле Kotlin. Если вы выберете Class , Android Studio создаст новый исходный файл Kotlin с заданным именем и соответствующим определением класса. Если вы выберете Interface , интерфейс будет объявлен в файле и так далее.

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

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

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

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

Как только вы нажмете «ОК» , Android Studio добавит Kotlin в путь к классам вашего проекта и применит плагин 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"
    }
}

Котлин

// 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"
}

Котлин

// 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, вместо этого вы можете поместить файлы Kotlin в src/main/kotlin/ . Если вы сделаете это, вам также необходимо включить этот каталог в конфигурацию sourceSets , как показано ниже:

классный

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

Котлин

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

Преобразование существующего кода Java в код Kotlin

Чтобы преобразовать код Java в Kotlin, откройте файл Java в Android Studio и выберите «Код» > «Преобразовать файл Java в файл Kotlin» . Альтернативно создайте новый файл Kotlin ( Файл > Создать > Файл/класс Kotlin ), а затем вставьте в него свой Java-код. Затем Android Studio отображает приглашение и предлагает преобразовать ваш код в Kotlin, как показано на рисунке 5. Нажмите «Да» , чтобы преобразовать. При желании вы можете установить флажок Не показывать это диалоговое окно в следующий раз , чтобы будущие преобразования выполнялись автоматически.

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

Преобразование кода и возможность обнуления

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

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

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) {
                ...
            }
        });
    }
}

Несмотря на то, что переменная кнопки имеет значение NULL, для всех практических целей она никогда не должна иметь значение NULL при использовании в этом примере. Однако, поскольку его значение не назначается в момент создания, сгенерированный код 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. или принудить к разумному значению по умолчанию, отличному от нуля. Android Studio не располагает достаточной информацией для принятия такого решения в процессе преобразования. Хотя по умолчанию используется ненулевое утверждение, вам следует следить за этим и корректировать преобразованный код по мере необходимости.

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

Дополнительные сведения об использовании кода Kotlin и Java в вашем проекте см. в разделе Вызов кода Java из Kotlin .

Дополнительные сведения об использовании Kotlin в корпоративных сценариях см. в разделе «Принятие Kotlin для больших команд» .

Информацию об идиоматических оболочках Kotlin для существующих API Android см. в разделе Android KTX .