Содержание статьи
Немного об 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. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»
Комментарии (7)
Статья неактуальна
WARNING: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.
It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html
Affected Modules: app
В этом методе, вы вызываете 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
не подскажете, в чем дело?
Есть же ConstraintLayout, наглядность все таки важна, но да раздутие xml во View и поиск представлений не так быстро, вот бы чтобы вместо xml сразу шло хранение в генерируемом коде, то и со скоростью ситуация была лучше.
А возможен ли предпросмотр верстки на Anko?
0_о
*кожу на JAVA
А мне xml нравится. Мне так удобнее что дизайн отделен. Но в случаях когда дизайн генерится кодом тогда конечно котлин поприкольней выглядит. Сейчас многие на котлине помешаны) Но я так как недавно программирую под Android, решил пока не заморачиваться с изучением kotlin, сроки поджимают, поэтому кожу на андроиде, документации всё таки побольше. Учитывая что вся эта java-хрень вечно ломается и сыпется при обновлениях. В мире .net все намного проще и интересней, у нас на работе уже джависты завидуют .net-щикам и хотят переходить на C#, после того как мы им показали кучу фишек. Kotlin это то какой должна быть Java! Kotlin некая проекция C# в мир java.