Уверен, из статей раз и два ты уже понял, что ][ любит этот сладкий от синтаксического сахара язык программирования. Наша сегодняшняя статья поможет и так не сильно загруженному 🙂 Kotlin-разработчику разгрузиться еще больше: с помощью библиотеки Anko ты избавишься от необходимости писать разметку интерфейса в XML и получишь доступ к множеству упрощающих разработку функций.
 

Немного об Anko

Anko — официальная библиотека Koltin для Android. Это не часть основного рантайма Kotlin и не обязательный компонент, а что-то вроде чемоданчика инструментов.

Ключевой компонент Anko — библиотека UI, которая способна существенно упростить программирование интерфейса. Чтобы понять, что это такое, рассмотрим, как мы обычно программируем интерфейс приложения. Для этого необходимо создать XML-файл с разметкой, с помощью графического интерфейса или вручную расставить лайоты и виджеты, присвоить каждому виджету ID, затем написать код, который найдет эти виджеты с помощью findViewById() и выполнит над ними какие-то действия (например, повесит на кнопку колбэк с обработчиком нажатия).

Это вполне нормальный и общепринятый метод описания интерфейса, он применяется во многих других фреймворках, средах и операционных системах. Но в нем есть множество проблем: код в XML не типобезопасен, его нельзя переиспользовать, XML обрабатывается на самом девайсе, из-за чего рендеринг интерфейса происходит медленно. В конце концов, писать и редактировать XML просто неудобно, даже несмотря на все, что делает Android Studio для ускорения этого процесса (о визуальном редакторе я молчу, его можно использовать только на этапе прототипирования, потом придется править руками).

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

Anko предлагает очень элегантный способ решить эту проблему. Просто посмотри на этот код:

verticalLayout {
    val name = editText()
    button("Say Hello") {
        onClick { toast("Hello, ${name.text}!") }
    }
}

Эти шесть строк создают LinearLayout с вертикальным расположением элементов, размещают в нем строку ввода, под ней кнопку Say Hello, которая при нажатии берет текст из строки ввода и выводит на экран сообщение «Hello, <текст из строки ввода>!». И это, заметь, не какой-то отдельный язык описания интерфейса, а вполне обычный код на Kotlin.

Недурно, не так ли? В разы проще аналогичной разметки XML и тем более проще, чем интерфейс, описанный классическим способом. А выполнен он будет на 400% быстрее, чем код из XML.

Но и это еще не все. В четвертой строчке ты можешь заметить, что колбэку onClick в качестве аргумента передается лямбда с вызовом функции toast(). Эта функция тоже входит в состав Anko и фактически является более коротким эквивалентом такой строки:

Toast.makeText(context, "Hello, ${name.text}!", Toast.LENGTH_SHORT).show();

В Anko масса подобных шорткатов. Например, так можно запустить активность:

startActivity<SomeActivity>()

Это эквивалент следующих двух строк:

val intent = Intent(this, SomeOtherActivity::class.java)
startActivity(intent)

А так — показать диалоговое окно:

alert("Warning", "Anko is cool?") {
    yesButton { toast("Yes") }
    noButton { }
}.show()

Позвонить указанному абоненту тоже можно:

makeCall("002")

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

 

Пишем приложение

Наше приложение будет крайне простым, но полноценным. Мы сделаем countdown-таймер, чтобы он отсчитывал количество секунд, которое ты выберешь с помощью выдвижного меню слева (drawer), выводил на экран прогресс отсчета с помощью круга, а по окончании показывал toast-сообщение.

Несмотря на свою простоту, приложение научит тебя сразу нескольким весьма важным вещам:

  • создавать базовые графические элементы с помощью Anko: выдвижную панель, статус-бар, кнопки, прогресс-бары;
  • выносить код разметки из основного кода приложения c помощью компонентов Anko;
  • работать с фрагментами;
  • работать со сторонними виджетами;
  • использовать сопрограммы Kotlin, новую мощнейшую фичу Kotlin 1.1.
 

Создаем проект и подключаем библиотеки

Для создания проекта я рекомендую использовать Android Studio 3.0. Она хоть и носит статус «альфы», но прекрасно работает, а плагин Kotlin в нее уже встроен. Создаем новый проект, оставляем дефолтные настройки, а в самом конце выбираем Empty Activity. Так среда не будет за нас генерировать начальный код, который нам не нужен.

Никаких активностей, нам нужен «голый» проект
Никаких активностей, нам нужен «голый» проект

Когда проект будет создан, открываем build.gradle (Project) и добавляем репозиторий jitpack:

allprojects {
    repositories {
        // ...
        maven { url "https://jitpack.io" }
    }
}

Продолжение доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все материалы на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи один материал

Заинтересовала информация, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для материалов, опубликованных более двух месяцев назад.


6 комментариев

  1. spqr911

    01.08.2017 at 07:50

    А мне xml нравится. Мне так удобнее что дизайн отделен. Но в случаях когда дизайн генерится кодом тогда конечно котлин поприкольней выглядит. Сейчас многие на котлине помешаны) Но я так как недавно программирую под Android, решил пока не заморачиваться с изучением kotlin, сроки поджимают, поэтому кожу на андроиде, документации всё таки побольше. Учитывая что вся эта java-хрень вечно ломается и сыпется при обновлениях. В мире .net все намного проще и интересней, у нас на работе уже джависты завидуют .net-щикам и хотят переходить на C#, после того как мы им показали кучу фишек. Kotlin это то какой должна быть Java! Kotlin некая проекция C# в мир java.

  2. spqr911

    01.08.2017 at 07:51

  3. Skybad

    14.08.2017 at 09:48

  4. Implozia

    05.11.2017 at 20:11

    А возможен ли предпросмотр верстки на Anko?

  5. zm_sansan

    22.11.2017 at 02:20

    Есть же ConstraintLayout, наглядность все таки важна, но да раздутие xml во View и поиск представлений не так быстро, вот бы чтобы вместо xml сразу шло хранение в генерируемом коде, то и со скоростью ситуация была лучше.

  6. Tohaman

    04.12.2017 at 14:49

    В этом методе, вы вызываете createNavigationView()

    // Метод, возвращающий корневой View и все дочерние элементы
    override fun createView(ui: AnkoContext): View = with(ui) {
    mDrawer = drawerLayout {
    lparams(width = matchParent, height = matchParent)
    createContainer()
    createNavigationView()
    }

    return mDrawer
    }

    но при этом, вроде как туда надо передать AnkoContext

    И еще у меня студия ругается на боковое меню

    Error:(57, 9) Cannot access class ‘android.support.design.widget.NavigationView’. Check your module classpath for missing or conflicting dependencies
    Error:(65, 25) ‘inline fun TextView.lparams(width: Int = …, height: Int = …): TextView’ can’t be called in this context by implicit receiver. Use the explicit one if necessary

    не подскажете, в чем дело?

Оставить мнение

Check Also

Власти ЕС оштрафовали Google на 5 млрд долларов за антимонопольные нарушения

На этой неделе стало известно, что Еврокомиссия оштрафовала Google на рекордные 4,3 млрд е…