Tìm hiểu về Android KTX(Phần 1)
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 =)) Andorid KTX là gì ? Là 1 bộ các Kotlin Extension dành cho việc ...
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 =))
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
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 .