Статьи

Создание функциональных приложений для Android в Kotlin: начало работы

Хотя подавляющее большинство приложений для Android написано на Java, не существует правила, согласно которому вы должны использовать Java для разработки под Android. Существует множество современных языков программирования, которые предназначены для работы на виртуальной машине Java (JVM), и одним из этих языков, который становится популярным в сообществе Java, является Kotlin.

В первой части этой серии из трех статей мы рассмотрели, что такое Kotlin и что он может предложить разработчикам Android:

  • Он на 100% взаимозаменяем с Java, так что вы можете продолжать использовать существующие библиотеки Java и фреймворки, и даже можете использовать смесь кода Java и Kotlin в ваших проектах Android.
  • Его синтаксис спроектирован так, чтобы чувствовать себя очень похожим на Java, а это значит, что разработчикам Java должно быть довольно легко разобраться с основами Kotlin.
  • Он сочетает в себе функции и концепции как функционального, так и процедурного программирования.
  • Это хорошо поддерживается Android Studio.

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

Но сначала пришло время научить нашу среду разработки говорить на новом языке!

Самое первое, что вам нужно сделать, это добавить поддержку Kotlin в вашу установку Android Studio.

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

Если вы уверены, что ваша среда разработки обновлена, вы готовы установить плагин Kotlin. Запустите Android Studio, и вы должны увидеть окно « Добро пожаловать в Android Studio» — если это окно не появляется, полностью закройте Android Studio и перезапустите его.

Нажмите значок « Настройка» , а затем выберите « Плагины» в следующем раскрывающемся списке.

Откройте меню Android Studios Настройка плагинов.

Нажмите кнопку Установить плагины JetBrains …

Установите плагин Kotlin для Android Studio

Выберите Kotlin из меню, а затем нажмите зеленую кнопку Install . Вам нужно будет перезапустить вашу IDE, прежде чем плагин Kotlin станет активным, поэтому либо нажмите кнопку « Перезапустить Android Studio» , которая появляется, либо перезапустите вашу IDE вручную.

На этом этапе ваша IDE может понимать и запускать код Kotlin, но вам все равно придется настраивать Kotlin каждый раз, когда вы захотите использовать его в новом проекте. Давайте создадим новый проект и настроим этот проект для использования Kotlin сейчас. Создайте новый проект с настройками по вашему выбору, но для простоты выберите « Пустое действие» при появлении запроса.

Благодаря плагину Kotlin, настройка проекта для использования Kotlin не может быть проще: просто выберите Инструменты на панели инструментов Android Studio, а затем Kotlin и Configure Kotlin в Project.

Выберите Android Studios Инструменты Kotlin Настройка Kotlin в опции проекта

Откроется всплывающее окно, где вы можете настроить Kotlin для:

  • все модули
  • все модули, содержащие файлы Kotlin
  • или один, названный модуль

Поскольку в своем проекте я собираюсь использовать только код Kotlin, я выбрал все модули . Вы также можете выбрать, какую версию Kotlin вы хотите использовать — обычно это будет последняя версия.

Кроме того, вы можете настроить Kotlin, выбрав « Справка» в строке меню Android Studio, а затем « Найти действие». На панели « Найти действие» начните вводить « Настройка Kotlin» в Project , а затем выберите эту опцию, когда она появится.

Параметр « Настроить Kotlin in Project» вносит ряд изменений в файлы build.gradle вашего проекта, поэтому давайте подробнее рассмотрим, как эти файлы изменились. Откройте файл build.gradle уровня проекта — он должен выглядеть примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
buildscript {
 
  //Declares the version of Kotlin that you’re using.
  ext.kotlin_version = ‘1.0.5-2’
  repositories {
    jcenter()
  }
  dependencies {
    classpath ‘com.android.tools.build:gradle:2.2.2’
     
    //Declares the Kotlin Gradle plugin as a classpath dependency//
    classpath «org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version»
  }
}
 
allprojects {
  repositories {
     jcenter()
  }
}

Теперь давайте взглянем на файл build.gradle уровня модуля :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
apply plugin: ‘com.android.application’
 
//Applies the Kotlin Android plugin//
apply plugin: ‘kotlin-android’
 
android {
  compileSdkVersion 25
  buildToolsVersion «24.0.0»
 
  defaultConfig {
    applicationId «com.jessicathornsby.kotlinexample»
    minSdkVersion 21
    targetSdkVersion 25
    versionCode 1
    versionName «1.0»
  }
 
  buildTypes {
    release {
      minifyEnabled false
      proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
    }
  }
 
  //Although Gradle will compile any Kotlin files it finds in src/main/java, it’s good practice to store your Kotlin files in a dedicated Kotlin directory.
  sourceSets {
    main.java.srcDirs += ‘src/main/kotlin’
  }
}
 
dependencies {
  compile fileTree(dir: ‘libs’, include: [‘*.jar’])
  androidTestCompile(‘com.android.support.test.espresso:espresso-core:2.2.2’, {
    exclude group: ‘com.android.support’, module: ‘support-annotations’
  })
 
  compile ‘com.android.support:appcompat-v7:25.0.1’
  testCompile ‘junit:junit:4.12’
 
  //Adds the Kotlin Standard Library as a project dependency//
  compile «org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version»
}
repositories {
  mavenCentral()
}

Наконец, синхронизируйте свои изменения, щелкнув « Синхронизировать сейчас» в появившемся всплывающем окне или щелкнув значок « Синхронизировать проект с файлами Gradle » на панели инструментов Android Studio.

Особенностью плагина Kotlin, которая особенно полезна для новичков Kotlin, является его способность конвертировать любой исходный файл Java в Kotlin при сохранении полной совместимости во время выполнения.

Возможность точно увидеть, как любой Java-файл будет переводиться на Kotlin, идеально подходит для того, чтобы помочь вам выучить язык, но он также может пригодиться на протяжении всего вашего путешествия по Kotlin — если вы когда-нибудь пытаетесь понять, как написать что-то на Kotlin, Вы всегда можете написать его на Java, а затем использовать эту функцию для преобразования этого кода в Kotlin.

Давайте преобразуем файл MainActivity нашего проекта в исходный файл Kotlin. Существует два способа вызова действия « Преобразовать Java-файл в Kotlin-файл» плагина Kotlin :

  • Выберите файл MainActivity , а затем выберите « Код » в строке меню Android Studio, а затем « Преобразовать файл Java в файл Kotlin» .

Преобразуйте существующий файл Java в файл Kotlin, выбрав Код Преобразовать файл Java в файл Kotlin
  • Или выберите « Справка» в строке меню Android Studio, а затем « Найти действие» . В следующем всплывающем окне начните вводить Преобразовать файл Java в файл Kotlin, а затем выберите этот параметр, когда он появится. Обратите внимание, что вы также можете запустить всплывающее окно « Найти действие» с помощью сочетания клавиш: если вы используете Mac, нажмите клавиши Command-Shift-A , а если вы работаете в Windows или Linux, нажмите Control-Shift-A .

Просто помните, что в зависимости от сложности вашего кода конверсия не всегда может быть точной на 100%, поэтому вы всегда должны проверять конвертированный код на наличие ошибок.

Ваш недавно преобразованный MainActivity должен выглядеть примерно так:

01
02
03
04
05
06
07
08
09
10
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
 
class MainActivity : AppCompatActivity() {
 
  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
  }
}

Вы также заметите, что расширение файла изменилось, превратившись из MainActivity.java в MainActivity.kt .

Это может быть простое Activity , но эти несколько строк иллюстрируют некоторые ключевые характеристики синтаксиса Kotlin. Так как это наш первый взгляд на некоторый реальный код Kotlin, давайте разберем этот класс построчно.

В Kotlin вы объявляете классы, используя ключевое слово class , точно так же, как в Java. Однако в Kotlin классы (и методы) по умолчанию являются общедоступными и окончательными, поэтому вы можете создать класс, просто написав class MainActivity .

Когда дело доходит до расширения класса, вы заменяете расширения Java двоеточием, а затем присоединяете имя родительского класса. Итак, в первой строке нашего файла MainActivity.kt мы создаем открытый финальный класс с именем MainActivity, который расширяет AppCompatActivity :

1
class MainActivity : AppCompatActivity() {

Java-эквивалент будет:

1
public class MainActivity extends AppCompatActivity {

Если вы хотите переопределить класс или метод, вам нужно явно объявить его открытым или абстрактным.

В Kotlin функции определяются с помощью ключевого слова fun , за которым следует имя функции и параметры в скобках. В Kotlin имя функции предшествует ее типу:

1
override fun onCreate(savedInstanceState: Bundle?) {

Это противоположность Java, где тип стоит перед именем:

1
public void onCreate(Bundle savedInstanceState)

Обратите внимание, что мы не указываем, что этот метод является окончательным, так как в Kotlin все методы являются окончательными по умолчанию.

Остальная часть этого занятия выглядит очень похоже на Java. Тем не менее, эти несколько строк иллюстрируют еще одну ключевую характеристику Kotlin:

1
2
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

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

Теперь, когда мы расшифровали наш файл MainActivity.kt , давайте переместим его в соответствующий каталог . Поскольку плагин Kotlin столкнулся с проблемой добавления объявления src / main / kotlin в наш файл build.gradle , давайте создадим этот каталог. Этот шаг не является обязательным, но хранение ваших файлов Kotlin в специальном каталоге сделает проект более чистым.

В обозревателе проектов Android Studio щелкните , удерживая клавишу Control, в главном каталоге вашего проекта и выберите « Создать» в появившемся меню, а затем « Каталог» . Назовите этот каталог kotlin и затем нажмите OK .

Создать специальный каталог Kotlin

Если вы не можете найти основной каталог вашего проекта, откройте маленький выпадающий список в верхнем левом углу окна Project Explorer и выберите Project . Теперь у вас не должно возникнуть проблем с обнаружением этого неуловимого каталога src / main .

Откройте меню Android Project Studios и выберите «Проект».

Создав специальный каталог Kotlin , перетащите в него файл MainActivity.kt . Просто сохраните имя существующего пакета вашего файла MainActivity.kt , чтобы ваш проект все еще работал .

Кроме того, если вы собираетесь использовать Kotlin только в этом проекте, вы можете удалить каталог Java , а не загромождать свой проект пустыми и ненужными каталогами.

Поскольку Kotlin компилируется в байт-код, приложение, написанное на Kotlin, выглядит точно так же, как приложение, написанное на Java, поэтому попробуйте установить это приложение на ваше устройство Android или совместимое AVD — должно быть, как будто ничего не изменилось.

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

Чтобы создать файл Kotlin, удерживая клавишу Control, щелкните каталог приложения / src / main / kotlin и выберите « Создать»> «Деятельность Kotlin» .

Создайте новую активность Kotlin, выбрав каталог Kotlin и нажав «Новая активность Kotlin».

Дайте вашему классу имя и выберите класс из выпадающего меню. Ваш новый класс должен выглядеть примерно так:

1
2
3
class SecondActivity {
 
}

На данный момент ваша активность пуста. Чтобы приступить к добавлению некоторых реальных функций, вам необходимо выполнить несколько шагов. Во-первых, добавьте операторы import вы хотите использовать. Единственное отличие между операторами импорта в Kotlin и операторами импорта в Java заключается в том, что вам не нужно заканчивать каждую строку точкой с запятой. Например:

1
2
3
import android.app.Activity
import android.os.Bundle
import android.app.Activity

Затем вам нужно будет указать класс, который вы расширяете, используя тот же формат, который мы видели в нашем файле MainActivity.kt :

1
2
3
class SecondActivity : Activity() {
  
}

Далее вам нужно переопределить метод onCreate в onCreate :

1
2
3
override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
}

Теперь вы можете добавить любую функциональность, какую захотите, в это действие (и в следующем разделе я покажу вам, как использовать расширения Kotlin для управления виджетами пользовательского интерфейса, так что это может быть хорошим началом), но последний момент настройки вам нужно завершить объявление вашей активности Kotlin в вашем манифесте . Это следует в точности той же формуле, что и объявление новой активности Java, например:

1
2
3
4
5
6
7
8
<activity
      android:name=».SecondActivity»
      android:label=»@string/second»
      android:parentActivityName=».MainActivity»>
    <meta-data
        android:name=»android.support.PARENT_ACTIVITY»
        android:value=».MainActivity»/>
  </activity>

Теперь, когда мы освоили основы, давайте более подробно рассмотрим, на что действительно способен Kotlin — начиная с функции, которая может реально сократить объем стандартного кода, который вам нужно написать.

В Android каждый раз, когда вы хотите работать с любым View в действии, вам нужно использовать метод findViewById чтобы получить ссылку на это представление. Это делает findViewById одним из самых важных, но также и одним из самых разочаровывающих фрагментов кода, который вы будете снова и снова писать в своих проектах Android. Метод findViewById является огромным источником потенциальных ошибок, и если вы работаете с несколькими элементами пользовательского интерфейса в одном и том же Activity, то все эти findViewById могут действительно загромождать ваш код, затрудняя его чтение.

Хотя существует ряд библиотек, таких как Butter Knife, которые стремятся устранить необходимость в findViewById , эти библиотеки по-прежнему требуют, чтобы вы аннотировали поля для каждого представления, что может привести к ошибкам и при этом требует значительных усилий. было бы лучше инвестировать в другие области вашего проекта.

Плагин Kotlin Android Extensions (который недавно был включен в стандартный плагин Kotlin) обещает сделать findViewById делом прошлого, предлагая вам преимущества вышеупомянутых библиотек без недостатка необходимости писать какой-либо дополнительный код или отправлять дополнительное время выполнения. ,

Вы можете использовать расширения Kotlin для импорта View ссылок в ваши исходные файлы. На этом этапе плагин Kotlin создаст набор «синтетических свойств», которые позволят вам работать с этими представлениями так, как если бы они были частью вашей деятельности, — это принципиально означает, что вам больше не нужно использовать findViewById для поиска каждого View прежде чем вы сможете работать с этим.

Чтобы использовать расширения, вам нужно включить плагин Kotlin Android Extensions в каждом модуле, поэтому откройте файл build.gradle уровня модуля и добавьте следующее:

1
apply plugin: ‘kotlin-android-extensions’

Синхронизируйте эти изменения, щелкнув всплывающее окно « Синхронизировать сейчас» .

Затем вы можете импортировать ссылки в один View , используя следующий формат:

1
import kotlinx.android.synthetic.main.<layout>.<view-id>

Например, если ваш файл textView1 содержал TextView с идентификатором textView1 , вы должны импортировать ссылку на это представление, добавив в свою Activity :

1
import kotlinx.android.synthetic.main.activity_main.textView1

После этого вы сможете получить доступ к textView1 в этом textView1 используя только его идентификатор — и без findViewById !

Давайте посмотрим на расширения в действии, добавив TextView в наш файл activity_main.xml , импортировав его в наш файл MainActivity.kt и используя расширения для программной установки текста TextView .

Начните с создания вашего TextView :

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?xml version=»1.0″ encoding=»utf-8″?>
 
<RelativeLayout xmlns:android=»http://schemas.android.com/apk/res/android»
  xmlns:tools=»http://schemas.android.com/tools»
  android:id=»@+id/activity_main»
  android:layout_width=»match_parent»
  android:layout_height=»match_parent»
  android:paddingBottom=»@dimen/activity_vertical_margin»
  android:paddingLeft=»@dimen/activity_horizontal_margin»
  android:paddingRight=»@dimen/activity_horizontal_margin»
  android:paddingTop=»@dimen/activity_vertical_margin»
  tools:context=»com.jessicathornsby.myapplication.MainActivity»>
 
  <TextView
      android:id=»@+id/myTextView»
      android:layout_width=»wrap_content»
      android:layout_height=»wrap_content»
       />
 
</RelativeLayout>

Затем вы можете импортировать TextView в ваш MainActivity.kt и установить его текст, используя только его идентификатор:

01
02
03
04
05
06
07
08
09
10
11
12
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.myTextView
 
class MainActivity : AppCompatActivity() {
 
  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      myTextView.setText(«Hello World»)
  }
}

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

1
import kotlinx.android.synthetic.main.<layout>.*

Например, если вы хотите импортировать все виджеты из вашего файла activity_main.xml , добавьте в свою активность следующее:

1
kotlinx.android.synthetic.main.activity_main.*.

Во второй части мы рассмотрели настройку среды разработки для поддержки Kotlin и рассмотрели, насколько просто преобразовать существующий код Java в Kotlin. Мы также рассмотрели некоторые основные характеристики синтаксиса Kotlin и представили расширения Kotlin для Android в нашем проекте.

В третьей и последней части мы рассмотрим некоторые более продвинутые функции языка Kotlin, которые, как разработчик Android, вы должны найти особенно полезными.

  • Понимание параллелизма на Android с помощью HaMeR

  • Начните с Firebase для Android

  • Android с нуля: аппаратные датчики

  • Начните с шаблона приложения для Android за 60 секунд

  • Делайте фотографии с помощью приложения для Android

  • Практический параллелизм на Android с HaMeR