Добавьте 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 .