Hôm nọ rảnh rỗi lang thang trên mạng thì mình cũng thấy 1 cụm từ lạ lạ : Android KTX , vì tò mò nên cũng có lướt qua các trang web xem nó là cái gì , sau 1 hôm tìm hiểu thì mình xin “mạn phép” được viết vài dòng về cái KTX này =))

1 Khái niệm :

Andorid KTX là gì ? Là 1 bộ các Kotlin Extension dành cho việc phát triển các ứng dụng Android . Nó là 1 thư viện giúp tối ưu lợi thế của kotlin trong các project (giảm lượng code) , đồng thời giúp project dễ hiểu và thú vị hơn .
Hiện tại thì cái lib này đạng ở trạng thái preview do đó nó sẽ thay đổi nhiều và sẽ có nhiều tính năng hơn trong bản release .

Document của KTX có thể tìm thấy ở đây :
https://android.github.io/android-ktx/core-ktx/index.html

Và lib thì trong link này :
https://github.com/android/android-ktx

Và tiếp theo , mình sẽ bắt đầu với Animator functions trong KTX

Animator functions

Có 1 bộ collection về animation trong thư viện này , hãy xem qua một chút về những cái đang có trong phiên bản hiện tại nhé .

Animation listener

Trong KTX , chúng ta có thể set 1 animation listener đối với 1 animator như sau :

animator.addListener { handleAnimation(it) }

Listener này hỗ trợ chúng ta nhận callback đối với các animation event . Chúng ta có thể thậm chí thêm các function đối với các callback chỉ định của listener , bạn chỉ cần đưa function callback mà bạn muốn nhận dữ liệu vào :

animator.addListener(
        onEnd = {}, 
        onStart = {}, 
        onCancel = {}, 
        onRepeat = {}
)

Điều này có thể giảm phần lớn những đoạn code không cần thiết trong callback

Individual animation event listeners

Chúng ta có khả năng lắng nghe các sự kiện riêng trong android , với KTX thì có thể thêm thêm 1 pause listener cùng kiểu với hàm addListener():

animator.addPauseListener { handleAnimation(it) }
// or 
animator.addPauseListener(
        onPause = {},
        onResume = {}
)

Lần nữa , chỉ yêu cầu đưa vào các function chúng ta cần cho callback

Ta cũng có thể lắng nghe các sự kiện riêng biệt của animation trong 1 dòng code :

animator.doOnPause { handleAnimation(it) }

animator.doOnCancel { handleAnimation(it) }

animator.doOnEnd { handleAnimation(it) }

animator.doOnRepeat { handleAnimation(it) }

animator.doOnStart { handleAnimation(it) }

animator.doOnResume { handleAnimation(it) }

Nếu bạn đang sử dụng code java đối với các animation trong project, bạn sẽ chú ý về mức tối giản của code . Mỗi lần gọi ở trên đại diện cho 1 Animator instance được sử dụng .

Content

Có hàng đống các extension functions được thêm vào trong package Content . Nếu chúng ta cần gọi system service thì cũng có 1 extension giúp chúng ta làm việc đó luôn :

val alarmManager = systemService<AlarmManager>()

Styled attributes cũng có thể sử dụng thông qua các extension functions này luôn :

context.withStyledAttributes(set = someAttributeSet, attrs = attributes, defStyleAttr = ..., defStyleRes = ...) {
    // block to execute
}
context.withStyledAttributes(set = someAttributeSet, attrs =
attributes) {
    // block to execute
}

Việc sử dụng shared preferences khá tuyện với hàm edit :

sharedPreferences.edit { 
    putBoolean(key, value) 
}

Bạn cũng có thể tạo 1 ContentValues bằng cách dùng hàm contentValuesOf() , và truyền vào 1 biến kiểu Pair :

val contentValues = contentValuesOf(somePairs...)

Time operations

KTX cũng đưa ra các operation liên quan đến TIme .
Bây h ta có thể truy cập vào DayOfWeek, Month và Year như 1 giá trị kiểu int chỉ đơn giản như sau :

DayOfWeek.FRIDAY.asInt()
Month.APRIL.asInt()
Year.now().asInt()

Class Duration cũng có rất nhiều hàm khả dụng :

// Retrieve values from destructuring
val (seconds, nanoseconds) = Duration.ofSeconds(1)
// Perform multiplication
val result = Duration.ofSeconds(1) * 2
// Perform division
val result = Duration.ofSeconds(2) / 2
// Perform negation
val result = -Duration.ofSeconds(2)

Những hàm sau cũng khá hay , chúng hỗ trợ ta dễ dàng hơn trong việc lấy các giá trị kiểu Int của các hàm :

someInt.asDayOfWeek() // return DayOfWeek instance

someInt.asMonth() // returns Month instance

someInt.asYear() // returns Year instance

someInt.days() // returns Period instance

someInt.hours() // returns Duration instance

someInt.millis() // returns Duration instance

someInt.minutes() // returns Duration instance

someInt.months() // returns Period instance

someInt.nanos() // returns Duration instance

someInt.seconds() // returns Duration instance

someInt.years() // returns Period instance

Trả về kiểu Long thì cũng Ok luôn :

someLong.asEpochMillis() // returns Instant instance

someLong.asEpochSeconds() // returns Instant instance

someLong.hours() // returns Duration instance

someLong.millis() // returns Duration instance

someLong.minutes() // returns Duration instance

someLong.nanos() // returns Duration instance

someLong.seconds() // returns Duration instance

OS

Hiện có 1 bộ collection hỗ trợ cho package android OS. Nó bao gồm các extention làm việc với lớp Handler :

handler.postAtTime(uptimeMillis = 200L) {
    // some action
}
handler.postDelayed(delayInMillis = 200L) {
    // some action
}

Tạo 1 biến kiểu Bundle cũng dễ hơn nhiều :

val bundle = bundleOf("some_key" to 12, "another_key" to 15)

val bundle = persistableBundleOf("some_key" to 12, "another_key" to 15)

Trong TH bạn cần đến trace , thì càng dễ :

trace("section_name") { }

Mình xin phép dừng phần 1 ở đây , hen gặp lại các bạn trong phần 2 .

Mình tham khảo theo link này .