Как использовать Kotlin в ваших проектах Android
Kotlin, язык программирования с открытым исходным кодом, разработанный JetBrains, становится все более популярным среди разработчиков Java. Он часто рекламируется как преемник Java. По сравнению с Java, он предлагает более богатый опыт разработки, потому что он более современный, выразительный и лаконичный.
Если вы ищете альтернативный язык программирования для разработки Android, вы должны попробовать Kotlin. Его можно легко использовать вместо или в сочетании с Java в ваших проектах Android.
В этом уроке я покажу вам, как использовать плагины Kotlin и Kotlin в ваших проектах Android Studio.
Предпосылки
Чтобы следовать за мной, вам нужно:
- последняя версия Android Studio
- базовое понимание синтаксиса Kotlin
Если вы не знакомы с языком программирования Kotlin, я рекомендую прочитать раздел «Начало работы» секции Kotlin, чтобы познакомиться с языком.
1. Установка плагинов Kotlin
В меню быстрого запуска Android Studio выберите Настройка> Плагины.
На следующем экране нажмите Установить плагин JetBrains.

Выберите Kotlin Extensions для Android из списка и нажмите Установить плагин справа.

Поскольку плагин зависит от плагина Kotlin, вас попросят установить оба. Нажмите Да, чтобы начать установку.

По завершении установки перезапустите Android Studio, чтобы активировать плагины.
2. Создание Kotlin Activity
В Android Studio щелкните правой кнопкой мыши имя вашего пакета и выберите Создать> Файл Kotlin.

В появившемся диалоговом окне введите имя нового Activity и выберите Класс в раскрывающемся списке. Я назвал свой класс MainActivity.

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

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

Чтобы настроить проект для поддержки Kotlin, плагин Kotlin вносит несколько изменений в файл build.gradle. Примените эти изменения, нажав кнопку Синхронизировать сейчас, как показано ниже.

На этом этапе конфигурация вашего проекта завершена. Вернитесь к классу Kotlin, который вы создали минуту назад, чтобы начать писать код на Kotlin.
3. Использование Kotlin
Чтобы упростить пример, я покажу вам, как создать Activity с помощью одного TextView , который отображает String .
Убедитесь, что ваш класс является подклассом Activity и переопределяет его метод onCreate . Конечно, вы должны сделать это в Kotlin. Если вы новичок в Kotlin, я предлагаю вам использовать функциональность генерации кода Android Studio, нажав Control + O, чтобы получить сигнатуры метода справа.

Теперь ваш класс должен выглядеть следующим образом:
package com.hathy.kotlinsample
Туториал по Kotlin для начинающих: создаем простой квиз

Туториал по Kotlin для начинающих: создаем простой квиз
Kotlin — один из двух официальных языков, используемых при разработке под Android, и язык, который стоит выбрать, говоря о платформе Google. Для тех, кто начинает изучать Kotlin это хорошая новость, ведь это простой и приятный для изучения язык. Пройти туториал по Kotlin проще, чем вы думаете, а это значит, что теперь любой может начать создавать приложения под Android!
Kotlin стал участником этого праздника позже, чем его брат Java — ведь официальный статус получил только с 2017 года. Кроме того, он реже используется за пределами Android, поэтому многие авторитетные разработчики до сих пор сторонятся его.
В этом туториале по Kotlin мы рассмотрим процесс создания простого приложения на Kotlin — квиза, что послужит отправной точкой для изучения Kotlin в целом. Приступим!
Создаем ваш первый Android-проект на Kotlin

Чтобы изучить Kotlin для разработки под Android, вам сначала нужно скачать Android Studio и все настроить.
Как только это будет сделано, создайте новый проект и убедитесь, что вы выбрали Kotlin в качестве языка в раскрывающемся меню. Теперь выберите Empty Activity в качестве начального шаблона.
Вас встретит код, выглядящий следующим образом:
class MainActivity : AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) >>
Этот шаблонный код находится в вашем файле MainActivity.kt и является первым, запускающемся при создании приложения. Этот код сообщает Android, что нужно отобразить файл макета: activity_main.xml. Android Studio легко делает это для нас в другой вкладке в верхней части основного окна. Вы можете перейти в эту вкладку в любое время, чтобы увидеть визуальный дизайнер, в котором вы можете перетаскивать элементы, такие как кнопки и текст вью. Если при открытии этого файла вы видите только код, вам нужно переключиться в «Design», нажав кнопку в правом верхнем углу.
В разработке под Android вам нужно будет работать не только с Kotlin/Java, но и с XML. XML означает «Extensible Markup Language» (расширяемый язык разметки) и является «markup language» (языком разметки). Это означает, что он не диктует логику или динамические действия, а просто определяет, где происходит что-то на странице.
При создании приложений под Android вам нужно будет создать макеты с помощью XML и визуального дизайнера, а затем определить, как эти элементы отрабатывают в соответствующем коде на Kotlin или Java.
А пока просто следуйте инструкциям, и, надеюсь, все станет ясно!
Kotlin: начало работы и создание макета
Прежде чем мы начнем изучать программирование на Kotlin, мы сначала внесем некоторые изменения в XML-файл, чтобы создать дизайн, который хотим.

Упростить все можно, просто нажав на Code, а затем вставив следующее, чтобы перезаписать то, что уже есть:
Это, в свою очередь, означает, что мы можем сосредоточиться на программировании на Kotlin и не беспокоиться о том, как выглядит наше приложение. По крайней мере сильно.
Заставляем кнопки хоть что-то делать!
Теперь у нас есть макет, и хорошая новость заключается в том, что ссылаться на эти элементы и изменять их в программе Kotlin очень легко.
Для этого нам нужно обратиться к «ID» (идентификатору), которые мы предоставили нашим вьюшкам. View — это техническое название виджетов, составляющих наш макет, таких как кнопки и текстовые метки.
Вы увидите, что мы уже сделали это в XML:
android:id="@+id/button"
В данном случае «ID» кнопки — «button». Обратите внимание, что написание чувствительно к регистру. Слово Button с заглавной буквы B на самом деле относится к более широкой концепции всех кнопок в Kotlin.
Следовательно, мы можем ссылаться на кнопку в нашем коде. Если бы мы написали button.setText («Right Answer!») , тогда текст на первой кнопке изменился бы на Right Answer! .

Но мы не хотим этого делать. Вместо этого мы сделаем так, чтобы при нажатии первой кнопки появлялось CORRECT (ПРАВИЛЬНО!) и этим мы сообщаем нашему игроку, что он выбрал правильное решение.
Для этого мы собираемся вывести на экран сообщение, известное как «toast message» (всплывающее сообщение-подсказка). Это небольшой плавающий пузырь с текстом, который исчезает через пару секунд.
Не беспокойтесь о строке с текстом, создающей и отображающей это всплывающее сообщение, вы будете ей редко пользоваться, и это часть Android, а не Kotlin.
Мы собираемся сделать так, чтобы эти сообщения отображались, когда мы нажимаем на одну из этих кнопок:
button.setOnClickListener < Toast.makeText(applicationContext,"CORRECT!",Toast.LENGTH_SHORT).show() >button2.setOnClickListener < Toast.makeText(applicationContext, "WRONGO!", Toast.LENGTH_SHORT).show() >button3.setOnClickListener < Toast.makeText(applicationContext, "WRONGO!", Toast.LENGTH_SHORT).show() >>
Поместите этот код в функцию onCreate (это весь код в фигурных скобках после слова onCreate). В Kotlin, как и в Java, код можно «заблокировать», поместив его в фигурные скобки. Такое группирование полезно, если мы хотим, чтобы определенный набор кода выполнялся, например, за пределами прямолинейной траектории. И совсем скоро мы узнаем, что же такое «function» (функция).
Нажмите зеленую кнопку воспроизведения в Android Studio IDE, убедившись, что виртуальное устройство настроено или устройство Android подключено. Вы увидите, что игра появится на экране, и вы сможете выбрать вариант ответа. Вот так да! Клик на «A» отобразит правильное сообщение, а два других должны отобразить неправильное сообщение.
Kotlin туториал — Использование функций в Kotlin
Вы можете подумать, что уже создали свое первое приложение на Kotlin под Android, но на самом деле программирования на Kotlin здесь мало. Скорее, мы полагаемся в основном на XML для внешнего вида и на Android SDK для производительности. Например, setText не является примером Kotlin, а скорее является частью класса Android (TextView). То есть сам Kotlin не поддерживает эти типы кнопок и текстовых лейблов, а просто используется в данном случае для структуры.
Наш квиз еще совсем мал. В нем только один вопрос, и ответ привязан к единственной кнопке. Если мы хотим превратить все это в динамическую программу, которая может отображать несколько вопросов и ответов, нам нужно добавить некоторую логику. Здесь на помощь приходит код на Kotlin.
Во-первых, давайте создадим структуру получше. В программировании мы стараемся не вводить что-то чаще, чем это необходимо, поэтому собираемся поместить все наши всплывающие сообщения в функцию. Функция — это фрагмент кода, на который можно ссылаться в любой точке остальной части программы.
Чтобы определить функцию, нам нужно дать ей имя, которое будет описывать то, что она делает. Затем мы добавляем к этому префиксу слово » fun » (развлечение) и ставим за ним фигурные скобки. Убедитесь, что вы делаете это вне функции onCreate , но внутри класса MainActivity (хотя это очень упрощенное решение, но фактически это имя файла).
Здесь мы собираемся показать всплывающее сообщение ( «toast»). Чтобы увидеть, как это работает, поместим только одно всплывающее сообщение в нашу функцию, а затем вызовем его с помощью первой кнопки:
class MainActivity : AppCompatActivity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener < showToast() >> fun showToast() < Toast.makeText(applicationContext,"CORRECT!",Toast.LENGTH_SHORT).show() >>
Запускаем. Код будет вести себя точно так же, как и раньше. Единственная разница в том, что он стал лучше организован.
Видите, только теперь нам нужно записать имя функции в двух скобках, чтобы выполнить нашу строку кода в любой момент. Если бы showToast() сделал что-то более сложное, это могло бы сэкономить нам бесчисленное количество часов; особенно, если нам когда-нибудь понадобится изменить способ отображения всплывающего сообщения!
Что мы действительно хотим сделать, так это изменить ответ, который отображается в зависимости от кнопки, которую нажимают. Мы могли бы сделать это с помощью второй функции, но еще лучше было бы поместить оба сообщения внутри одной функции.
Для этого мы собираемся использовать две новые концепции программирования на Kotlin.
Аргументы, переменные и условные операторы Kotlin
Теперь вы знаете, как использовать функции для группировки разделов кода в Android, и в следующей части этого руководства по Kotlin произойдет настоящее волшебство. Вы овладеете тремя бесценными навыками программирования на Kotlin и любом другом языке!
Во-первых, переменная — это «контейнер» для данных. Другими словами, переменная позволяет использовать слово для обозначения другого слова, числа или даже списка элементов. Скорее всего, вы помните переменные из уроков алгебры:
a + 2 = 3, найдите a!
Здесь, очевидно, используется для обозначения «1». Мы аналогичным образом используем переменные в программировании, чтобы у нас была возможность изменять поведение нашего кода в зависимости от взаимодействия с пользователем или других входных данных.
Что мы также можем делать с переменными, так это передавать их между функциями. Когда мы это делаем, мы называем это «аргументом». По сути, это позволяет нам передавать входные данные в нашу функцию для изменения выходных данных.
Чтобы определить аргументы, которые будет принимать функция, нам просто нужно поместить их в фигурные скобки.
Мы используем тип переменной, называемый интеджером (или целым числом), который в Kotlin называется Int . Интеджеры, как вы также можете помнить из математики, — это целые числа без десятичных знаков.
Поэтому нам нужно обновить нашу функцию, чтобы она выглядела так:
fun showToast(answer: Int)
Здесь имя функции — answer (ответ), и она имеет целочисленный тип. Теперь, когда мы впоследствии вызываем нашу функцию, нам нужно добавить целое число в фигурные скобки:
showToast(1)
Вы можете передать в функцию столько аргументов, сколько захотите, при условии, что вы определите их каждый и разделите запятыми.
В этом случае мы собираемся присвоить каждой кнопке номер. A = 1, B = 2 и C = 3. Теперь функция showToast знает, какую кнопку нажал пользователь!
button.setOnClickListener < showToast(1) >button2.setOnClickListener < showToast(2) >button3.setOnClickListener
Теперь нам просто нужно изменить всплывающее сообщение, которое отображается в зависимости от того, какой ответ мы читаем!
Для этого мы используем так называемый «условный оператор». Это означает, что строка кода будет работать только при определенных условиях. В этом случае мы покажем правильное сообщение, только если пользователь выбрал правильный ответ. Мы достигаем этого с помощью следующего кода:
if (answer==1)
Это инструкция if , и она покажет код внутри фигурных скобок только в том случае, если инструкция в обычных скобках имеет значение true . В этом случае, если переменная answer содержит значение 1 , мы можем запустить код!
Что делать, если ответ — 2 или 3 ? Что ж, мы всегда можем использовать еще две условные инструкции! Но более быстрым решением было бы использовать инструкцию else . Она делает именно то, что вы ожидаете, когда следует за инструкцией if :
fun showToast(answer: Int) < if (answer==1) < Toast.makeText(applicationContext, "CORRECT!", Toast.LENGTH_SHORT).show() >else < Toast.makeText(applicationContext, "WRONGO!", Toast.LENGTH_SHORT).show() >>
Делаем игру увлекательной
Если вы не усвоили информацию с первого раза, рекомендую перечитать несколько раз. Это самая важная часть туториала по Kotlin, и с помощью всего лишь нескольких навыков вы сможете обрабатывать очень много кода!
Затем мы изменим наши новые приемы программирования, чтобы превратить это в настоящую игру.
Сначала мы создадим еще три переменные. Это будут глобальные переменные, созданные вне каких-либо функций и, следовательно, доступные для всех функций.
Обратите внимание, что в Kotlin вам не нужно назначать тип переменной. В таких языках, как Java, вам нужно сразу указать, является ли ваша переменная Int (целым числом), String (строкой), Float (числом с плавающей точкой) и т. д. В Kotlin мы можем просто написать var и позволить Kotlin разбираться самостоятельно!
Перед функцией onCreate() добавьте эти три строки:
var questionNo = 0 var questions = listOf("What are the two official languages for Android development? \n\n A) Kotlin and Java \n\n B) Java and Python \n\n C) Kotlin and Python", "How do you define a function in Kotlin? \n\n A) void \n\n B) var \n\n C) function", "What is a variable used for? \n\n A) To contain data \n\n B) To insert a random value \n\n C) Don't know", "What does SDK stand for in Android SDK? \n\n A) Software Development Kit \n\n B) Software Development Kotlin \n\n C) Something Don't Know") var rightAnswers = listOf(1, 2, 1, 1)
Переменная questionNo — это целое число и будет использоваться для отслеживания номера вопроса, который мы задаем. Переменная questions представляет из себя список, означающий, что это переменная, которая может содержать несколько значений — в данном случае несколько строк. Каждая из наших строк разделена запятой, и ей будет присвоен индекс, на который можно будет ссылаться позже (обратите внимание, что первому элементу в списке присваивается индекс: 0). Важно, что символ \n распознается Kotlin (и большинством языков) как символ «новой строки» и фактически не отображается в нашем выводе.
(Это выглядит некрасиво, и если вы создаете реальное приложение, то лучше хранить эти значения в отдельном XML-файле.)
Последняя строка создает еще один список, на этот раз заполненный целыми числами. Это правильные ответы на каждый наш вопрос!
Затем мы создаем новую функцию с названием updateQuestion . Все, что мы собираемся здесь сделать, это изменить наш вопрос в зависимости от номера вопроса. Делаем это так:
fun updateQuestion()
Поскольку мы вызываем эту функцию только тогда, когда кто-то получает правильный ответ, мы можем безопасно увеличить значение нашей переменной questionNo в начале функции. Затем мы собираемся задать вопрос, который отображается, обновив textView.
Когда мы используем get со списком как в коде выше, нам нужно только вставить индекс в скобки, чтобы получить значение, которое там помещено. Таким образом, мы можем перейти к следующему вопросу, постепенно увеличивая это значение.
Наконец, мы меняем наше условие «right answer» (правильный ответ) на любую правильную запись в нашем списке правильных ответов. Полученный код должен выглядеть так:
class MainActivity : AppCompatActivity() < var questionNo = 0 var questions = listOf("What are the two official languages for Android development? \n\n A) Kotlin and Java \n\n B) Java and Python \n\n C) Kotlin and Python", "How do you define a function in Kotlin? \n\n A) void \n\n B) var \n\n C) function", "What is a variable used for? \n\n A) To contain data \n\n B) To insert a random value \n\n C) Don't know", "What does SDK stand for in Android SDK? \n\n A) Software Development Kit \n\n B) Software Development Kotlin \n\n C) Something Don't Know") var rightAnswers = listOf(1, 2, 1, 1) override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) button.setOnClickListener < showToast(1) >button2.setOnClickListener < showToast(2) >button3.setOnClickListener < showToast(3) >> fun showToast(answer: Int) < if (answer==rightAnswers.get(questionNo)) < Toast.makeText(applicationContext, "CORRECT!", Toast.LENGTH_SHORT).show() updateQuestion() >else < Toast.makeText(applicationContext, "WRONGO!", Toast.LENGTH_SHORT).show() >> fun updateQuestion() < questionNo = questionNo + 1 textView.setText(questions.get(questionNo)) >>
Продолжаем
Запустите этот код, и теперь вы должны обнаружить, что вопрос обновляется каждый раз, когда вы получаете правильный ответ! Это полноценная игра, и вы могли бы создать гораздо больше подобных проектов, используя приобретенные навыки.

Единственная небольшая проблема со всем этим заключается в том, что прямо сейчас игра вылетает, как только у вас закончатся вопросы!
Но вместо того, чтобы принести вам решение на блюдечке с золотой каемочкой, я призываю вас найти ответ самостоятельно. В конце концов, именно так вы по-настоящему изучите Kotlin: создавая свои собственные проекты и узнавая, как реализовывать каждую новую задачу по мере необходимости.
Как создать Андроид-приложение самому?

Команда Infoshell подготовила пошаговый план как создать Андроид-приложение самому. В статье вы также найдёте ссылки на полезные ресурсы для обучения Android-разработке.
Учите Kotlin
- Код на Котлине примерно на 20% компактнее, чем на Java. Лаконичность синтаксиса упрощает код и его читабельность, что повышает качество кода и облегчает поиск ошибок. Кроме того, компактность кода снижает затраты, ускоряет создание, поддержку и производительность мобильного приложения.
- Язык прост в использовании. Например, привычная для Джавы ошибка NullPointerException (появляется когда приложение Java пытается использовать null вместо объекта) не возникает в Котлине.
- С Котлином открыт доступ ко всем фреймворкам и библиотекам Java. Язык полностью совместим с уже написанным Java-кодом. Вы можете постепенно перенести мобильное приложение с Джавы на Котлин без необходимости писать
код с нуля.
Но одним Котлином сыт не будешь. Учите параллельно и Джаву. В Андроид-разработке вы с ним неизбежно столкнетесь.
Где учить Kotlin?
Вы можете освоить Котлин и Андроид-разработку в целом, используя бесплатные источники ниже:
- Документация Google по Android-разработке – официальный сайт по андройд-разработке. Тут можно познакомиться с инструментами разработчика, API, передовыми методами создания приложений и пройти десятки бесплатных курсов.
- Сайт Kotlin – тут найдете подробную документацию с основными фичами и концептами языка.
- Try Kotlin – задания по Kotlin с консолью, куда можно вносить и проверять код.
- Kotlin Bootcamp для программистов – учебное пособие по Kotlin от Google.
- Android Kotlin Fundamentals Course – мини-курсы по основам Android Kotlin.
- Руководство по языку Kotlin – десятки статей о работе с Kotlin на английском языке.
Загрузите инструментарий для разработки мобильного приложения для Андроид
Установите программу Android Studio (AS). Это официальное средство создания Андроид-приложений с удобными инструментами для создания, отлаживания и развертывания программ.
Также для Андроид-разработки понадобится Android SDK (Android Studio после запуска автоматически загрузит SDK). Этот набор инструментов включает следующие компоненты:
- Инструменты разработки приложений:
- Android Debug Bridge для взаимодействия с Андроид-устройством;
- Android Asset Packaging Tool для упаковки ресурсов программы;
- Dalvik Executable для преобразования байткода в формат, понятный виртуальной машине Dalvik или ART и
другие.
- Андроид-библиотеки:
- Android Support Library – обеспечивает совместимость со старыми версиями Андроид;
- AndroidX – предлагает улучшенные компоненты и инструменты для разработки.
- Интерфейсы API платформы. Открывают доступ к различным функциям и возможностям Android-устройства: камера, сеть, геолокация, датчики и другие.
- Эмуляторы Андроид и образы системы. Позволяют тестировать и отлаживать мобильное приложение на виртуальных устройствах Android. Образы системы Андроид можно использовать для создания виртуальных устройств с различными версиями Андроид.
После установки всех инструментов можно создавать первый проект.
Создайте и настройте проект

Далее переходим к настройке параметров проекта. В следующем окне указываем:
- Название проекта.
- Название пакета приложения.
- Место сохранения, где ваша программа будет сохранена локально (папка на вашем ПК).
- Выберите язык, на котором будете писать код в Андроид Студио: Kotlin или Java.
- Выберите минимальный уровень API, на котором будет работать ваша программа.


Далее появится окно:

Откройте экран проекта View > Tool Windows > Project и выберите Android View. Теперь в боковой панели в папке app вы видите файлы:
- …manifests > AndroidManifest.xml – объясняет атрибуты мобильного приложения, определяет каждый его компонент.
- …java > com.example.myfirstapp > MainActivity – при запуске программы на этапе ее разработки система запускает экземпляр этого действия и загружает его макет.
- …drawable > layout > activity_main.xml – XML-файл, определяющий макет UI-дизайна. В нем есть элемент TextView с текстом «Hello, World!»
- …Gradle Scripts > build.gradle – здесь 2 файла с одинаковым названием. Первый для проекта «Project: My_First_App.», второй – для модуля приложения «Module: My_First_App.app.». Каждый модуль имеет свой файл build.gradle, который используется для управления тем, как плагин Gradle разрабатывает вашу программу.
Запустите приложение на смартфоне
Проект создан, код написан. Теперь можно запустить программу и проверить ее работоспособность. Нужно подсоединить смартфон к ПК через USB-шнур, зайти в «Параметры разработчика» и активировать отладку по USB. Для этого выполните шаги:
- Зайдите в «Настройки», затем – «О телефоне» (на смартфонах с Андроид 8.0 или новее зайдите в раздел «Система»).
- Внизу страницы найдите и коснитесь 7 раз строки «Номер сборки».
- Вернитесь на шаг назад, перейдите в «Параметры разработчика» и активируйте отладку по usb.
В Android Studio выберите ваш проект в «Toolbar’s run/debug configurations drop-down menu». Затем выберите устройство для запуска вашей программы и кликайте «Выполнить». После этого в приложении на смартфоне отобразится «Hello, World!».
Запустите мобильное приложение через эмулятор

- В Андроид Студио выберите эмулятор смартфона Андроид, на котором нужно установить и запустить приложение.
- Далее выберите ваш проект.
- Нажмите «Run», после чего AS установит мобильное приложение на виртуальное устройство и запустит эмулятор. В приложении в AS должно отобразиться «Hello, World!».
Как перестать кодить на Java и начать жить: сто* причин изучить Kotlin

Ребята из JetBrains сделали очень много крутых вещей, среди которых Kotlin — молодой, но очень перспективный язык программирования под JVM и Android. В этой статье я покажу, чем этот язык может заинтересовать Android-разработчика и заставить его навсегда позабыть про Java.
Java сдает позиции
Стоит признать, что Java в последнее время развивается не очень активно. Новые фишки добавляются в нее со скрипом. Отчасти это вызвано тем, что «большая» Java, та, что еще называется Java EE, тащит за собой огромный багаж проектов, которые необходимо беречь при апгрейде на новую версию. Из-за этого появляются новые JVM-совместимые языки программирования, которые, с одной стороны, не обременены обратной совместимостью и могут развиваться очень динамично, а с другой — могут работать со всей огромной кодовой базой Java: библиотеками, фреймворками, плагинами. И Kotlin — один из таких языков.
Эта статья не научит тебя азам и не покажет тебе Hello world на Kotlin. Она здесь для того, чтобы заинтересовать тебя, программиста под Android, новым инструментом разработки — невероятно гибким, расширяемым и простым.
![]()
INFO
Язык Java назван в честь марки кофе, которая получила имя от острова Ява в Индонезии. Шутка ли, что существует и остров Котлин? Он находится в Финском заливе около Санкт-Петербурга, и на нем располагается город Кронштадт.
Лаконичность
Kotlin очень бережет время программиста и старается сделать так, чтобы тот долбил по клавишам как можно реже. Взгляни на этот пример инициализации пары переменных на Kotlin:
var userNames = ArrayList() val admin = "ADMIN"
Ключевые слова var и val указывают, что ты хочешь объявить переменную или константу. При этом тебе не нужно задавать их тип самостоятельно — в большинстве случаев Kotlin сам может определить тип переменной по коду. А теперь давай посмотрим на эквивалентный код на Java и найдем менее очевидные отличия:
ArrayList userNames = new ArrayList<>(); final String admin = "ADMIN";
Во-первых, ты наконец-то можешь перестать писать ; в конце каждой строки, теперь это не обязательно. Во-вторых, ты избавляешься от ключевого слова new перед созданием объекта.
Еще один отличный пример лаконичности Kotlin — это строковые шаблоны. Вспомни, как Java издевалась над тобой, когда ты хотел составить строку с какими-нибудь динамическими данными. Наверняка это выглядело примерно так:
// Плохой вариант String message = "Hello " + name + " " + lastName; // Вариант получше String message = String.format("Hello %1$S %2$S", name, lastName;
А теперь забудь это, ведь с механизмом строковых шаблонов на Kotlin ты можешь вставлять переменные прямо внутрь строки:
val message = "Hello $name $lastName"
Ты можешь использовать для составления строки даже вызов метода, если обернешь его в фигурные скобки. К примеру:
"Hello $"
Теперь давай рассмотрим пример, непосредственно связанный с Android. Сможешь посчитать, сколько раз ты писал вызов findViewById(. ) ? Я встречал проекты, в которых их было почти 400! Конечно, есть ButterKnife, который сделает все за тебя, но даже с ним тебе придется заводить отдельное поле под каждую вьюшку, чтобы навесить на него аннотацию @BindView . В Kotlin все становится еще проще, если подключить стандартный плагин kotlin-android-extensions. Этот плагин позволяет, добавив всего одну строчку в секции import , получить доступ ко всем вьюшкам, имеющим уникальный ID в XML-разметке. Смотри, как это работает.
Подготовим XML-разметку нашего будущего экрана со всего одной кнопкой, которую назовем pushMe.
// Файл activity_main.xml
Создадим новую активити с названием MainActivity и установим ей наш лейаут.
class MainActivity : Activity() < override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) >>
Немного о синтаксисе языка
В Kotlin нет аннотации @Override , но есть ключевое слово override . Слово extends превратилось в двоеточие, а методы (функции) объявляются ключевым словом fun .
ОK, теперь, чтобы получить доступ к нашей кнопке, просто добавим еще одну строку в секцию импортов:
// activity_main — имя файла с XML-разметкой import kotlinx.android.synthetic.main.activity_main.*
И все, теперь мы можем работать с кнопкой:
override fun onCreate(savedInstanceState: Bundle?) < super.onCreate(savedInstanceState) setContentView(R.layout.activity_auth) pushMe.setOnClickListener( // Что-то делаем по клику ) >
Еще одна фишка Kotlin, позволяющая писать меньше кода, — это лямбды. Вообще, лямбда-функции и функции высших порядков (функции, которые могут принимать функцию как параметр или возвращать ее) — это очень мощный инструмент, который заслуживает отдельной статьи, но в следующем примере я покажу тебе, как ты можешь их использовать в разработке под Android, даже не зная принципов работы.
Вот как обычно выглядит установка callback’а на клик по кнопке в Java:
pushMe.setOnClickListener(new View.OnClickListener() < @Override public void onClick(View v) < Toast.makeText(context, "Hi there!", Toast.LENGTH_SHORT).show(); >>);
Здесь создается новый анонимный класс, который реализует интерфейс View.OnClickListener , и он сразу передается в качестве параметра в метод setOnClickListener(. ) . Заметь, что у интерфейса View.OnClickListener есть всего один метод onClick(View view) , который тебе нужно реализовать. Эта информация пригодится нам позже.
А вот как это выглядит в Kotlin:
pushMe.setOnClickListener
Код стал в три раза короче! Все, что ты видишь, от первой фигурной скобки до последней — это и есть лямбда-функция. Фокус заключается в том, что все анонимные классы, у которых есть только один метод, могут быть написаны в Kotlin как лямбды.
Последнее, о чем я хочу рассказать тебе, говоря про компактность кода в Kotlin, — это property (свойства) классов и автоматическая генерация методов. В каждой популярной IDE под Java есть функция генерации кода, такого как getter’ы, setter’ы, toString() , equals() , hashCode() и прочие. Android Studio, к слову, умеет генерировать это все и еще немного больше (рис. 1).


Другие статьи в выпуске:
Xakep #211. Когда «Окна» смотрят в тебя
- Содержание выпуска
- Подписка на «Хакер» -60%
Давай посмотрим на типичный код модельного класса:
public class User < private String fullName; public User(String fullName) < this.fullName = fullName; >public String getFullName() < return fullName; >public void setFullName(String fullName) < this.fullName = fullName; >@Override public boolean equals(Object o) < if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return fullName != null ? fullName.equals(user.fullName) : user.fullName == null; >@Override public int hashCode() < return fullName != null ? fullName.hashCode() : 0; >@Override public String toString() < return "User'; > >
У класса есть одно приватное поле, getter и setter под него, конструктор и еще набор стандартных переопределенных методов. Очень много кода генерируется IDE. А если такой код может генерировать IDE, это может сделать и компилятор. Взгляни, насколько проще выглядит аналогичный Kotlin-код:
data class User(var fullName : String)
Нет, это не опечатка, это действительно эквивалентный класс, и он уместился в одну строку. Давай я расскажу подробнее, что здесь происходит. Во-первых, конструктор класса объявляется в той же строке, что и сам класс. Во-вторых, все переданные в конструктор var-параметры будут полями этого класса. В-третьих, все неприватные поля класса автоматически получают свои getter- и setter-методы. Наконец, ключевое слово data указывает компилятору сгенерировать методы equals() , hashCode() , toString() и copy() .
У методов getter и setter в Kotlin есть одна особенность. Если у класса есть одновременно и getter, и setter для какого-либо поля, то в Kotlin такое поле считается свойством (property) и для сокращения записи можно использовать следующий синтаксис:
// Обычный Java-синтаксис user.setFullName("Agent Smith") // Синтаксис Kotlin user.fullName = "Agent Smith" // Обычный Java-синтаксис String fullName = user.getFullName() // Синтаксис Kotlin val fullName = user.fullName
Обрати внимание, что ни в одном из случаев мы не работали с полем User.fullName напрямую, только через соответствующие getter -и setter-методы, хоть в случае с Kotlin это не так очевидно.
Ошибка на миллиард
Многие языки программирования пытаются по-своему решить ошибку на миллиард долларов, и Kotlin не исключение. Чтобы свести к минимуму возможность возникновения NullPointerException , в системе типов Kotlin есть типы nullable и non-null. Различаются эти типы знаком вопроса после имени самого типа. Это очень похоже на аннотации @Nullable и @NonNull в Java, но в отличие от последней Kotlin очень строго бдит за работой с типами nullable и non-null. К примеру, компилятор не даст тебе записать null в переменную non-null типа и не даст выполнить никакую операцию, потенциально приводящую к NPE, без предварительной проверки на null:
var myString : String myString = "Hi there!" myString = null // Ошибка компилятора // ? означает, что переменная может быть null var iAmNull : String? iAmNull = null // OK // Ошибка компилятора, iAmNull может быть null val len = iAmNull.length // После проверки на null можно делать что угодно if (iAmNull != null)
Конечно, негуманно заставлять тебя писать такие громоздкие конструкции для проверки на null, поэтому в Kotlin есть несколько null-safe-операторов, сокращающих запись:
// Оператор ?. вернет или значение выражения справа от него // Или null, если переменная — null val len = myString.length // len1 == 9 val len = iAmNull?.length // len2 == null // Конструкция if-else может возвращать значение val len = if (iAmNull != null) iAmNull.length else -1 // len == -1 // Elvis-оператор ?: // ?: вернет выражение слева, если оно не null, // или выражение справа в противном случае val len = iAmNull?.length ?: -1 // len == -1
Расширяемость
Программируя на Kotlin, ты смело можешь руководствоваться следующим принципом: если тебе чего-то не хватает — напиши это. Kotlin очень гибкий язык. Во многом за счет своих лямбд, функций высших порядков и функций расширения. Про первые две мы уже немного поговорили, теперь узнаем про последнюю. С помощью функции расширения (extension function) ты можешь добавить возможности уже существующим классам, даже стандартным, без изменения их кода. Представь, что тебе надоело писать эту длинную и зачастую одинаковую строчку Toast.makeText(context, «Hi there!», Toast.LENGTH_SHORT).show(); и ты хотел бы научить Activity делать часть работы самостоятельно. С функцией расширения в Kotlin это становится реальным:
fun Activity.toast(message: CharSequence)
Ключевое слово fun говорит о том, что дальше следует определение функции (метода, если тебе так привычнее). toast(message: CharSequence) — это имя функции и ее аргументы. В фигурных скобках — тело функции, все как обычно. А необычно здесь то, что перед именем функции через точку указан класс Activity . Это говорит компилятору, что эта функция теперь является методом Activity, и дает тебе право вызывать ее напрямую у любой Activity:
override fun onCreate(savedInstanceState: Bundle?)
Довольно неплохо! Но напоследок я покажу тебе кое-что покруче. Временами в программе возникает потребность пройтись по всем вьюшкам и что-то с ними сделать. Это выглядит примерно так:
int childCount = parentView.getChildCount(); for (int i = 0; i < childCount; i++) < View child = parentView.getChildAt(i); // Что-то сделать с child >
Проблем с этим кодом и не было бы, если бы его не приходилось частенько дублировать. Как мы можем улучшить себе жизнь на Kotlin? Комбинацией функции расширения и лямбды!
inline fun ViewGroup.loopViews(action: (View) → Unit) < for (i in 0..childCount)< action(getChildAt(i)) >>
Да-а, такая конструкция новичку в Kotlin покажется чуждой и сложной. Но если разложить все по полочкам. Смотри, с конструкцией fun ViewGroup.loopViews ты уже знаком — это функция расширения для стандартного класса ViewGroup . Unit — это аналог Void из Java. (action: (View) → Unit) говорит компилятору о том, что наша функция принимает на вход в качестве аргумента другую функцию (да-да, та самая функция высшего порядка!), у которой один аргумент типа View и которая не возвращает ничего ( Unit ), и имя ей — action . В теле нашей основной функции мы проходим по всем своим вьюшкам и вызываем над каждой вьюшкой ту функцию, которую нам передали в качестве аргумента. Ключевое слово inline тут нужно для оптимизации, чтобы не создавать новый объект action на каждый его вызов, сборщику мусора потом будет проще.
ОK, разобрались, но что нам это дает? Это дает возможность писать такого рода код:
parentView.loopViews < /* что-то сделать с каждой вьюшкой */ >// Например, закрасить все вьюшки черным цветом parentView.loopViews
Видишь? На Kotlin можно написать практически все, чего тебе не хватало на Java.
Как начать?
Хорошая новость: начать писать на Kotlin очень просто. Во-первых, нужно установить плагин Kotlin в Android Studio: Settings → Plugins → кнопка Browse Repositories → найти плагин Kotlin и установить его. Во-вторых, добавить поддержку Kotlin в свой проект: Help → Find Action → впиши в строке поиска kotlin → выбери пункт Configure Kotlin in Project, как показано на рис. 2, и дальше по инструкции. Студия сама добавит нужные строчки в конфиги build.gradle. В качестве бонуса в студии появится новая опция, позволяющая автоматически конвертировать существующие Java-классы в Kotlin: Code → Convert Java file to Kotlin file.

Вторая хорошая новость: тебе не обязательно переписывать весь свой проект на Kotlin. Добавив поддержку Kotlin, ты можешь писать новый код на этом языке, и он отлично будет работать с твоим кодом на Java. Весь твой Java-код останется доступен в Kotlin, все подключенные Java-библиотеки — тоже. Весь твой Kotlin-код будет доступен в Java (ну, почти весь).
Заключение
Я показал тебе только несколько крутых возможностей Kotlin, но за кадром осталось еще очень много интересного. Если тебе понравился новый язык и ты уже хочешь начать что-то делать самостоятельно, рекомендую заглянуть на официальный сайт Kotlin. Там в разделе Learn ты найдешь гайд по азам языка, а в разделе Try Online сможешь порешать задачки на Kotlin от элементарного до экспертного уровня. Удачи!
