Котлин — Джетпак и KTX

После серии постов об Anko было естественно перейти на KTX, в этом посте я покажу вам библиотеку от google, в которой есть много чего похожего на Anko и кое-что новое.

Прежде всего, откуда взялся KTX?

Что ж, Google обновляет набор библиотек для Android, старые библиотеки поддержки, предназначенные для уменьшения фрагментации операционной системы, были переименованы в androidx, а вместе с некоторыми новыми вещами, включая KTX, теперь они называются Jetpack. Эти инструменты призваны помочь разработчикам Android не только избежать фрагментации системы, но и иметь набор инструментов, которые сделают разработку Android приятной, продуктивной и производительной.

Итак, какова цель KTX?

Как и в случае с Anko, эта библиотека содержит набор функций kotlin и расширений для различных компонентов, которые помогут нам в нашей повседневной работе. Только ядро ​​KTX содержит инструменты для графики, анимации, контента, настроек, текста, представлений и виджетов.

Закончив введение, давайте перейдем к делу. Нам нужно добавить библиотеку в проект, это делается путем добавления следующих вещей:

// in the project gradle file, the root gradle file just in case, 
// we need to add the google repository
repositories {
 google()
}
// on the module gradle file we need to add the library
dependencies {
 implementation 'androidx.core:core-ktx:1.0.0'
}

Теперь мы можем начать пользоваться библиотекой! 🎉

В случае KTX документация для всех инструментов доступна как часть документации по Android, это проще, чем Anko, вам не нужно просматривать файлы библиотеки и проверять доступные функции и расширения.

Начнем с простых вещей из базовой библиотеки:

Мы хотим извлечь компоненты цвета:

val theColor = Color.RED // this could be a Long or Float too, 
//here it's Int
theColor.component1() //alpha
theColor.component2() //red
theColor.component3() //green
theColor.component4() //blue
//an Int value
theColor.toColorLong()
//a Long value
theColor.toColorInt()

В Kotlin есть методы для создания массивов, карт и других коллекций, с KTX вы можете создать объект ContentValues таким образом:

contentValuesOf(Pair("a", 0), Pair("b", 1))

Вы можете редактировать настройки, используя это:

//defaultSharedPreferences is from Anko, they work really well together huh?
//the commit is optional
`Context`.defaultSharedPreferences.edit(commit = true) {  
    putString("key", value)
}

Получить системную услугу можно таким образом:

val powman = `Context`.getSystemService<PowerManager>()

Некоторые помощники по растровым изображениям?:

myBitmap.toDrawable(getResources())
myBitmap.toAdaptiveIcon()
myBitmap.toIcon()
//also from a ByteArray
myByteArray.toIcon()
//And Uri
myUri.toIcon()
//from Drawable
//parameters are optional
myDrawable.toBitmap(width, height, config'Bitmap.Config')
//Also here parameters are optional
myDrawable.updateBounds(left, top, right, bottom)

Работать с Animator?:

myAnimator.addListener(onEnd = {animator -> Unit},
      onStart = {animator -> Unit},
      onCancel = {animator -> Unit},
      onRepeat = {animator -> Unit})
myAnimator.addPauseListener(onResume = {animator -> Unit},
       onPause = {animator -> Unit})
myAnimator.doOnCancel({animator -> Unit})
myAnimator.doOnEnd({animator -> Unit})
myAnimator.doOnPause({animator -> Unit})
myAnimator.doOnRepeat({animator -> Unit})
myAnimator.doOnResume({animator -> Unit})
myAnimator.doOnStart({animator -> Unit})

Доступ к компоненту Location?:

myLocation.component1()
myLocation.component2()

Некоторые Uri помощники:

myUri.toFile()
myFile.toUri()
myString.toUri()

Создайте пакет, как и с другими коллекциями:

bundleOf(Pair("a", 0), Pair("b", 1))
persistableBundleOf(Pair("a", 0), Pair("b", 1))

Опубликовать вовремя?

val time = //uptime in millis Long
myHandler.postAtTime(time) { }
val delay = //delay in millis Long
myHandler.postDelayed(delay) { }
//both have an optional token parameter

Нам всегда нужно работать с текстовыми значениями, какие-то хелперы?

val numbers = "1234"
if (numbers.isDigitsOnly()) { /*will execute this*/ }
val text = "My text "
val count = text.trimmedLength() //will return the lenght without the space
val htmlString = "<b>MyBoldText</b>"
val spanned = htmString.parseAsHtml() //this method contains optional parameters to handle different scenarios
val newHtmlString = spanned.toHtml() //Also contains an optional parameter
val locale = Locale()
val direction = locale.layoutDirection

Для создания составного текста существует множество методов расширения, которые позволяют добавлять текст и форматирование. Вы можете перейти здесь для получения подробной информации о методах расширения.

Наряду с этим есть расширения для типизированных AtomicFile, SparseArray, LruCache, Range, расширения для преобразования в Half, Pair, Size, все они доступны по этой ссылке.

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