Kotlin — один из двух официальных языков, используемых при разработке Android, и Google предпочитает его. Это хорошая новость для начинающих разработчиков из-за значительно меньшей кривой обучения и дружественности к новичкам. Найти свой путь через учебник Kotlin проще, чем вы думаете, а это означает, что теперь любой может начать создавать приложения для платформы Android!
Тем не менее, Kotlin также появился на вечеринке немного позже, чем его брат Java — он стал официальным языком только с 2017 года. Кроме того, он реже используется за пределами Android, поэтому многие опытные разработчики до сих пор не знакомы с ним.
В этом руководстве по Kotlin мы рассмотрим процесс создания простого приложения Kotlin — викторины, — которое послужит отправной точкой, чтобы помочь вам изучить Kotlin в целом. Начнем!
Читайте также: Руководство по разработке приложений для Android для начинающих за 5 простых шагов
Запускаем свой первый Android-проект на Kotlin
Чтобы изучить Kotlin для разработки под Android, вам сначала нужно скачать Android Studio и все настроить.
Смотрите также: Как установить 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 удобно открыла его для нас на другой вкладке в верхней части главного окна. Вы можете нажать на эту вкладку, чтобы увидеть визуальный конструктор, в котором вы можете перетаскивать элементы, такие как кнопки и текстовые представления. Если все, что вы видите, это дополнительный код при открытии этого файла, вам нужно переключиться в представление «Дизайн», нажав кнопку в правом верхнем углу.
В Android-разработке вам нужно будет работать не только с Kotlin/Java, но и с XML. XML означает «расширяемый язык разметки» и является «языком разметки». Это означает, что он не диктует логику или динамические действия, а просто определяет, где что находится на странице.
Когда вы создаете приложения для Android, вам необходимо создавать макеты с помощью XML и визуального дизайнера, а затем определять, как эти элементы работают в соответствующем коде Kotlin или Java.
Смотрите также: Я хочу разрабатывать приложения для Android — какие языки мне следует изучать?
А пока просто следуйте инструкциям, и, надеюсь, все станет ясно!
Kotlin: начало работы и создание макета
Прежде чем мы начнем изучать программирование на Kotlin, мы сначала внесем некоторые изменения в файл XML, чтобы создать желаемый дизайн.
Чтобы упростить процесс, вы можете просто щелкнуть представление «Cod», а затем вставить код ниже, чтобы перезаписать то, что уже есть:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Викторина Android!"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.117" />
<TextView
android:id="@+id/textView"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Какие два официальных языка используются для разработки Android? \n\n A) Kotlin и Java \n\n B) Java и Python \n\n C) Kotlin и Python"
android:textSize="11sp"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2"
app:layout_constraintVertical_bias="0.083" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="32dp"
android:text="A"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.674" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="40dp"
android:text="B"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/button"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.674" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="C"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.472"
app:layout_constraintStart_toEndOf="@+id/button2"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.674" />
</androidx.constraintlayout.widget.ConstraintLayout>
Это, в свою очередь, означает, что мы можем сосредоточиться на программировании на Kotlin и не беспокоиться о том, как выглядит наше приложение.
Заставьте кнопки работать!
Теперь у нас есть макет, хорошая новость в том, что очень легко ссылаться на эти элементы и изменять их в программировании на Kotlin.
Для этого нужно обратиться к «идентификаторам», которые мы дали нашим представлениям. «View» — это техническое название виджетов, составляющих наш макет, таких как кнопки и текстовые метки.
Вы увидите, что мы уже сделали это в XML:
android:id="@+id/button"
В этом случае «ID» кнопки — это «button». Обратите внимание на чувствительность к регистру. Слово «Button» с заглавной «В» на самом деле относится к более широкому понятию всех кнопок в Котлине.
Поэтому мы можем ссылаться на кнопку в нашем коде. Если бы мы написали button.setText(«Правильный ответ!»), тогда текст на первой кнопке изменился бы на «Правильный ответ!»
Но мы не хотим этого делать. Вместо этого мы собираемся сделать так, чтобы нажатие первой кнопки говорило «ПРАВИЛЬНО!» и сообщает нашему игроку, что он нажал правильное решение.
Для этого мы покажем на экране сообщение, известное как «toast message». Это небольшое плавающее текстовое облачко, которое исчезает через пару секунд.
Не беспокойтесь о строке текста, которая создает и отображает всплывающее сообщение, это то, что вам редко понадобится, и это часть Android, а не Kotlin.
Мы собираемся сделать так, чтобы эти сообщения отображались, когда мы нажимаем на одну из этих кнопок:
button.setOnClickListener {
Toast.makeText(applicationContext,"ПРАВИЛЬНО!",Toast.LENGTH_SHORT).show()
}
button2.setOnClickListener {
Toast.makeText(applicationContext, "НЕ ПРАВИЛЬНО!", Toast.LENGTH_SHORT).show()
}
button3.setOnClickListener {
Toast.makeText(applicationContext, "НЕ ПРАВИЛЬНО!", Toast.LENGTH_SHORT).show()
}
}
Поместите этот код внутрь функции onCreate (это весь код в фигурных скобках после слова onCreate). В Kotlin, как и в Java, код можно «заблокировать» вместе, поместив его в фигурные скобки. Эта группировка полезна, если мы хотим, например, чтобы определенный набор кода выполнялся за пределами линейного пути. Мы скоро узнаем, что такое «функция».
Теперь нажмите зеленую кнопку Run в Android Studio IDE, убедившись, что у вас настроено виртуальное устройство или подключено устройство Android. Теперь вы увидите, что ваша игра появляется на экране, и вы сможете выбрать отвечать. И вот, нажатие на «A» должно отображать правильное сообщение, а два других должны отображать неправильное сообщение.
Учебник по Kotlin — Использование функций в Kotlin
Можно подумать, что вы сделали свое первое приложение для Android на Kotlin, но на самом деле здесь очень мало программирования на Kotlin. Скорее, мы полагаемся в основном на XML для внешнего вида и Android SDK для производительности. «setText», например, не является примером Kotlin, а является частью класса Android (TextView). То есть сам Kotlin не поддерживает эти типы кнопок и текстовых меток, а просто используется для структуры.
И пока это не большая часть программы. Есть только один вопрос, и ответ отображается на одну кнопку. Если мы хотим превратить это в динамическую программу, которая может отображать несколько вопросов и ответов, нам нужно добавить логику. Вот тут-то и появляется код Kotlin.
Во-первых, давайте структурируем его немного лучше. В программировании мы не хотим вводить что-то больше одного раза, поэтому мы поместим всплывающие сообщения в функцию. Функция — это фрагмент кода, на который можно ссылаться в любой точке остальной части программы.
Читайте также: Введение в синтаксис Java для разработки под Android
Чтобы определить функцию, нам нужно дать ей имя, описывающее, что она делает. Затем мы предваряем это словом «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,"НЕ ПРАВИЛЬНО!",Toast.LENGTH_SHORT).show()
}
}
Запустите и код будет вести себя точно так же, как и раньше. Разница лишь в том, что код лучше организован.
Видите, как нам только теперь нужно написать имя функции с двумя скобками, чтобы выполнить нашу строку кода в любой точке? Если бы функция showToast() делала что-то более сложное, это могло бы сэкономить нам бессчетное количество часов; особенно если нам когда-нибудь понадобится изменить способ отображения всплывающего сообщения!
Что мы действительно хотим сделать, так это изменить ответ, который отображается в зависимости от кнопки, на которую нажали. Мы могли бы сделать это с помощью второй функции, но еще лучше было бы поместить оба сообщения в одну функцию.
Что мы действительно хотим сделать, так это изменить ответ, который отображается в зависимости от кнопки, на которую нажали. Мы могли бы сделать это с помощью второй функции, но еще лучше было бы поместить оба сообщения в одну функцию.
С этой целью мы собираемся использовать две новые концепции программирования на Kotlin.
Аргументы, переменные и условные операторы Kotlin
Теперь вы знаете, как использовать функции для группировки разделов кода в Android. В следующей части этого руководства по Kotlin произойдет настоящее волшебство. Теперь вы освоите три бесценных навыка программирования на Kotlin и любом другом языке!
Во-первых, переменная — это «контейнер» для данных. Другими словами, переменная позволяет вам использовать слово для представления другого слова, числа или даже списка элементов. Вы наверняка помните переменные из уроков алгебры:
а + 2 = 3, найди а!
Здесь a, очевидно, используется для обозначения «1». Аналогичным образом мы используем переменные в программировании, чтобы мы могли изменять поведение нашего кода в зависимости от взаимодействия с пользователем или других входных данных.
Что мы также можем делать с переменными, так это передавать их между функциями. Когда мы это делаем, мы называем это «аргументом». По сути, это позволяет нам передавать входные данные в нашу функцию, чтобы изменить выходные данные.
Читайте также: Курс для начинающих по Java — бесплатное и исчерпывающее руководство по основам Java
Чтобы определить аргументы, которые будет принимать функция, нам просто нужно поместить их в фигурные скобки.
Мы используем тип переменной, называемый целым числом, который в Kotlin называется «Int». Целые числа, как вы, возможно, помните из математики, — это целые числа без десятичных знаков.
Поэтому нам нужно обновить нашу функцию, чтобы она выглядела так:
fun showToast(answer: Int) { }
Здесь имя функции — «ответ», и она имеет целочисленный тип. Теперь, когда мы впоследствии вызываем нашу функцию, нам нужно добавить целое число внутри фигурных скобок:
showToast(1)
Вы можете передать в функцию столько аргументов, сколько хотите, если вы определяете их каждый и разделяете запятыми.
В этом случае мы собираемся назначить каждой кнопке номер. A = 1, B = 2 и C = 3. Теперь функция showToast знает, какую кнопку нажал пользователь!
button.setOnClickListener {
showToast(1)
}
button2.setOnClickListener {
showToast(2)
}
button3.setOnClickListener {
showToast(3)
}
Теперь нам просто нужно изменить всплывающее сообщение, которое отображается в зависимости от того, какой ответ мы читаем!
Для этого мы используем нечто, называемое «условным оператором». Это означает, что строка кода будет работать только при определенных условиях. В этом случае мы покажем правильное сообщение только в том случае, если пользователь нажал правильный ответ. Мы достигаем этого с помощью следующего кода:
if (answer==1) {
Toast.makeText(applicationContext, "НЕ ПРАВИЛЬНО!", Toast.LENGTH_SHORT).show()
}
Это оператор «если», и он покажет код внутри фигурных скобок только в том случае, если утверждение в обычных скобках истинно. В этом случае, если переменная «ответ» содержит значение «1», мы можем запустить код!
Что делать, если ответ 2 или 3? Что ж, мы всегда можем использовать еще два условных оператора! Но более быстрым решением было бы использование оператора «else». Это делает именно то, что вы ожидаете, когда оно следует из оператора «если»:
fun showToast(answer: Int) { if (answer==1) { Toast.makeText(applicationContext, «ПРАВИЬЛНО!», Toast.LENGTH_SHORT).show() } else { Toast.makeText(applicationContext, «НЕ ПРАВИЛЬНО!», Toast.LENGTH_SHORT).show() } }Делаем игру увлекательной
Если вы не поняли всего этого с первого раза, я рекомендую перечитать его несколько раз. Это самая важная часть учебника по Kotlin, и, обладая всего несколькими навыками, вы сможете справиться с огромным количеством кода!
Далее мы собираемся изменить наши новые кодовые приемы, чтобы превратить это в настоящую игру.
Во-первых, мы создадим еще три переменные. Это будут глобальные переменные, созданные вне каких-либо функций и, следовательно, доступные для всех функций.
Обратите внимание, что в Kotlin вам не нужно присваивать переменную типу. В таких языках, как Java, вам нужно сразу указать, является ли ваша переменная целым числом (целым числом), строкой (словом), числом с десятичным знаком (с плавающей запятой) и т. д. В Kotlin мы можем просто написать «var» и Kotlin разберется!
Перед функцией onCreate() добавьте следующие три строки:
var questionNo = 0
var questions = listOf(
"Какие два официальных языка используются для разработки Android? \n\n A) Kotlin и Java \n\n B) Java и Python \n\n C) Kotlin и Python",
"Как вы определяете функцию в Kotlin? \n\n A) void \n\n B) var \n\n C) function",
"Для чего используется переменная? \n\n A) Чтобы содержать данные \n\n B) Чтобы вставить случайное значение \n\n C) Не знаю",
"Что означает SDK в 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)
Первая переменная — другое целое число, и она будет использоваться для отслеживания номера вопроса, над которым мы работаем. Второй немного сложнее. Это «список», означающий, что это переменная, которая может содержать несколько значений — в данном случае несколько строк. Каждая из наших строк отделяется запятой и будет иметь индекс для ссылки позже (обратите внимание, что первый элемент в списке имеет индекс: 0). Обратите внимание, что символ \n распознается Kotlin (и большинством языков) как означающий «новая строка» и визуально не будет отображаться в выводе.
(Это выглядит некрасиво, и если вы создаете реальное приложение, вы можете вместо этого хранить эти значения в отдельном XML-файле.)
Последняя строка создает еще один список, на этот раз заполненный целыми числами. Это правильные ответы на каждый из наших вопросов!
Читайте также: Введение в C# для Android для начинающих
Далее мы создаем новую функцию с именем updateQuestion . Все, что мы собираемся здесь сделать, это изменить наш вопрос в зависимости от номера вопроса. Делаем это так:
fun updateQuestion() {
questionNo = questionNo + 1
textView.setText(questions.get(questionNo))
}
Поскольку мы вызываем эту функцию только тогда, когда кто-то получает правильный ответ, мы можем безопасно увеличить значение нашей переменной questionNo в начале функции. Далее мы собираемся задать вопрос, который будет отображаться путем обновления textView.
Когда мы используем «получить» таким образом со списком, нам нужно только вставить индекс в скобки, чтобы получить значение, которое там находится. Таким образом, мы можем получить следующий вопрос, постепенно увеличивая это значение.
Наконец, мы меняем наше условие «правильный ответ» на любую правильную запись в нашем списке правильных ответов. Результирующий код должен выглядеть так:
class MainActivity : AppCompatActivity() { lateinit var button: Button lateinit var button2: Button lateinit var button3: Button lateinit var textView: TextView var questionNo = 0 var questions = listOf( "Какие два официальных языка используются для разработки Android? \n\n A) Kotlin и Java \n\n B) Java и Python \n\n C) Kotlin и Python", "Как вы определяете функцию в Kotlin? \n\n A) void \n\n B) var \n\n C) function", "Для чего используется переменная? \n\n A) Чтобы содержать данные \n\n B) Чтобы вставить случайное значение \n\n C) Не знаю", "Что означает SDK в 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 = findViewById(R.id.button) button2 = findViewById(R.id.button2) button3 = findViewById(R.id.button3) textView = findViewById(R.id.textView) button.setOnClickListener { showToast(1) } button2.setOnClickListener { showToast(2) } button3.setOnClickListener { showToast(3) } } fun showToast(answer: Int) { if (answer == rightAnswers.get(questionNo)) { Toast.makeText(applicationContext, "ПРАВИЛЬНО!", Toast.LENGTH_SHORT).show() updateQuestion() } else { Toast.makeText(applicationContext, "НЕ ПРАВИЛЬНО!", Toast.LENGTH_SHORT).show() } } fun updateQuestion() { questionNo += 1 textView.setText(questions.get(questionNo)) } }
Продолжение учебника по Kotlin
Запустите этот код, и вы обнаружите, что вопрос обновляется каждый раз, когда вы даете правильный ответ! Это полноценная работающая игра, и вы могли бы создать еще много подобных проектов, используя полученные здесь навыки.
Единственная небольшая проблема со всем этим в том, что прямо сейчас игра вылетает, как только у вас заканчиваются вопросы!
Но вместо того, чтобы вручить вам ответ на серебряной тарелке, я собираюсь пригласить вас пойти и найти ответ самостоятельно. В конце концов, именно так вы действительно изучите Kotlin: создавая свои собственные проекты и учась делать каждую новую вещь по мере необходимости.
Найдите еще одно руководство по Kotlin, продолжайте учиться, и вскоре вы сможете создавать потрясающие приложения для Android!
Скачать проект можете https://github.com/gorban-app/KotlinApp