Сайт разработчика Александра Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Hello Kitty

Разница между приложением на Java и Kotlin не слишком большая. Воспроизведём пример на Kotlin.

Запускаем новый проект и не забываем поставить флажок у пункта Include Kotlin support.

Kotlin support

Далее выбираем нужные настройки.

Target Android Devices

Add an Activity to Mobile

Create New Project

Папка с ресурсами res ничем не отличается от Java-версии проекта. Можете повторить все шаги по добавлению в разметку компонента ImageButton и картинки для кнопки. Я только не стал использовать атрибут android:onClick, так студия не могла с ним работать.

Различия начинаются с файла класса MainActivity.kt. У него расширение kt вместо class, но располагается в аналогичном пакете как у Java.

Синтаксис кода также отличается. Первое, что бросается в глаза - не нужно ставить точку с запятой в конце оператора.

Общий код класса получится следующим. Я намерено оставил вещи, которые можно было упростить.


package ru.alexanderklimov.hellokot

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.ImageButton
import android.widget.TextView

class MainActivity : AppCompatActivity() {

    private lateinit var mHelloTextView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mHelloTextView = findViewById(R.id.textView)

        var imageButton: ImageButton = findViewById(R.id.imageButton)
        // альтернативный вариант
        // val imageButton = findViewById<ImageButton>(R.id.imageButton)

        imageButton.setOnClickListener {
            mHelloTextView.setText("Hello Kitty")
        }
    }
}

Запускаем и любуемся на первое приложение на Kotlin. В данном случае я написал код в Java-стиле, не используя особенностей Kotlin. Нужно объявить переменную на уровне класса? Используем ключевое слово lateinit. Нужно объявить компоненты? Пишем в привычном виде, вызывая findViewById(). Показать текст? Элементарно, нужно вызвать метод TextView.setText().

А теперь перепишем код.


package ru.alexanderklimov.hellokot

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        imageButton.setOnClickListener {
            textView.text = "Hello Kitty!"
        }
    }
}

Вас ничего не смущает? Где findViewById(), setText() и вот это всё?

Давайте разбираться. В build.gradle есть строчка apply plugin: 'kotlin-android-extensions', позволяющая автоматически получать доступ к компоненту через его идентификатор в ресурсах. Смотрите, в разметке у нас есть текстовая метка и кнопка с идентификаторами android:id="@+id/textView" и android:id="@+id/imageButton". Готово, теперь вы можете использовать эти имена в коде сразу без объявления: imageButton и textView. Студия импортирует нужный класс автоматически, когда вы захотите использовать данную возможность, обратите внимание на строку import kotlinx.android.synthetic.main.activity_main.*.

Теперь переходим к методу setText(). Kotlin позволяет заменить пары методов вида getXX/setXX свойствами без приставок. Были методы getText()/setText(), остались рожки да ножки свойство text. Если вы что-то присваиваете свойству, значит вы хотите использовать setText(), а если хотите прочитать значение свойства - значит вы хотите вызвать getText(). Вот так изящно работает Kotlin.

Дополнительные материалы

Hello Kitty на Android

Реклама