Android快速開發之Anko魔法(上篇)
眾所周知,目前 kotlin 已經作為 Google 官方推薦的 Android 開發語言,目前 GitHub/">GitHub 上面關於 kotlin 的專案已然呈現一片勢不可擋的熱度。作為一名 Android 開發者,學好 koltin 已經成為我們必須 get 的技能,而想要在工作中使用 kotlin 快速開發專案,Anko 無疑成為首選利器!
那麼 Anko 到底是什麼呢?可以為我們做哪些事情呢?
Anko 是一款 kotlin 的擴充套件庫,可以幫助我們更加簡單、快速的開發 Android 應用。它能夠讓我們的程式碼更加潔淨易讀,並且忘記 Java 那種繁瑣、複雜的程式設計方式。Anko 庫主要分為以下幾個部分:
-
Anko Commons
(通用擴充套件庫):一個輕量級的幫助庫,可以讓我們使用少量程式碼就可以輕鬆、快速使用
Intent
、Dialog
、Log
、Toast
、SnackBar
等常用功能。 - Anko Layouts (佈局擴充套件庫):一種快速、型別安全的方式去通過程式碼動態編寫 Android 佈局,有點類似 swift 中的方式。
- Anko SQLite (SQLite擴充套件庫):一個針對Android的SQLite查詢DSL和解析器的集合。
-
Anko Coroutines
(kotlin協程擴充套件庫):基於
kotlinx.coroutines
庫的擴充套件
由於一篇文章篇幅較長,故分為上下兩部分來講解,上篇主要介紹Anko Commons 擴充套件庫的相關功能。
Anko Commons
該庫主要包含一些常見功能的擴充套件和封裝,常見的有dialogs
、intent
、toast
、snackBar
等,下面我們先來看看具體如何使用它們。首先需要依賴一下擴充套件包:
// Anko Commons implementation "org.jetbrains.anko:anko-commons:0.10.8"
Toasts
Toast(吐司)算是我們最常用的功能,大家專案中或多或少都對其進行了一層封裝,anko 中使用也很方便,只需要這樣:
toast("login success!") toast(R.string.login_success) longToast("Wow, nice work!")
SnackBars
SnackBar 是Android5.0後material design
中常用控制元件之一,它的出現和Toast
差不多,為了給使用者帶來一些提示性資訊,具體特點可以自行查閱相關文章。通過 Anko 我們只需要通過以下方式就可以直接體會到它的魅力:
view.snackbar("login success!") view.snackbar(R.string.login_success) view.longSnackbar("Wow, nice work!") view.snackbar("Action, reaction", "Click me!") { doSomeThing() }
Dialogs
Dialog 是我們最常用的功能之一,它較為醒目,層級較高,其中最常用的當屬AlertDialog
了,通常我們這樣使用:
AlertDialog.Builder(this) .setPositiveButton(R.string.btn_allow_text) { _, _ -> request.proceed() } .setNegativeButton(R.string.btn_deny_text) { _, _ -> request.cancel() } .setCancelable(false) .setTitle("提示") .setMessage("我們需要請求使用您手機的部分許可權,是否同意?") .show()
雖然是鏈式呼叫,但使用較多時依舊很麻煩,通過 Anko,我們可以直接通過下面程式碼來實現相同功能:
alert("我們需要請求使用您手機的部分許可權,是否同意?", "提示"){ yesButton { request.proceed() } noButton { request.cancel() } }.show()
比較下來,是不是很方便,節省了一多半的程式碼量。
當然,很多時候我們需要使用AppCompat
下的AlertDialog
,因為它提供了向下相容的特性,保證在不同Android系統上儘量達到相同效果,這時我們需要依賴針對 AppCompat 的擴充套件包:
// Appcompat-v7 (only Anko Commons) implementation "org.jetbrains.anko:anko-appcompat-v7-commons:0.10.8"
然後我就可以直接這樣使用AppCompat
下的AlertDialog
了:
alert(Appcompat, "我們需要請求使用您手機的部分許可權,是否同意?", "提示"){ yesButton { request.proceed() } noButton { request.cancel() } }.show()
如果我們想自定義彈窗的佈局呢?彆著急,Anko 同樣為我們提供方式實現:
alert { customView { editText() } }.show()
什麼?這就完了?沒錯,如果你想在彈窗裡放一個輸入框,這樣就實現了。你肯定會好奇,怎麼設定layout呢?先別急,這是anko為我們提供的另外一個強大功能,這塊將在後面說到,先賣賣關子:grin:。
你可能又會突然想起來,AlertDialog
還為我們提供了列表單選功能呢,哈哈,anko 同樣為我們考慮到了,我們只需要這樣寫:
alert(Appcompat, "Please select your country where you come from", "Tips"){ yesButton { } noButton { } val countries = listOf("Russia", "USA", "Japan", "Australia") selector("Where are you from?", countries) { _, i -> toast("So you're living in ${countries[i]}, right?") } }.show()
怎麼樣,是不是也很方便?只需要在alert
域中通過selector
實現就可以了。
另外,Anko 同樣為我們提供了快速使用ProgressDialog
方式,例如:
val dialog = progressDialog(message = "Please wait…", title = "Tips")
Intent
開發過 Android 都知道,Intent
是我們構建頁面時必不可少的工具,它是四大元件通訊的"信使"。一般地,我們在專案中這樣使用:
val intent = Intent(this, SomeOtherActivity::class.java) intent.putExtra("id", 5) intent.setFlag(Intent.FLAG_ACTIVITY_SINGLE_TOP) startActivity(intent)
而我們通過 Anko 就完全可以通過一行程式碼實現:
startActivity(intentFor<SomeOtherActivity>("id" to 5).singleTop())
怎麼樣,是不是超級方便?而且它給我們提供的鏈式呼叫,很清晰,此外,它還為我們提供了Intent
常用功能,例如撥打電話、發郵件、分享等等:
Goal | Solution |
---|---|
Make a call |
makeCall(number)
withouttel:
|
Send a text |
sendSMS(number, [text])
withoutsms:
|
Browse the web |
browse(url)
|
Share some text |
share(text, [subject])
|
Send a email |
email(email, [subject], [text])
|
Log
Log 日誌功能我們平時應該說用的最多了,通常用來列印一些關鍵資訊,測試一些關鍵邏輯正確性。Anko 為我們提供了自己的擴充套件封裝,使用起來很方便:
class SomeActivity : Activity(), AnkoLogger { private fun someMethod() { info("London is the capital of Great Britain") debug(5) // .toString() method will be executed warn(null) // "null" will be printed } }
或者不想通過實現介面方式,可以藉助以下方式:
class SomeActivity : Activity() { private val log = AnkoLogger(this.javaClass) private val logWithASpecificTag = AnkoLogger("my_tag") private fun someMethod() { log.warning("Big brother is watching you!") } }
對應的日誌列印方法如下:
android.util.Log | AnkoLogger |
---|---|
v()
|
verbose()
|
d()
|
debug()
|
i()
|
info()
|
w()
|
warn()
|
e()
|
error()
|
wtf()
|
wtf()
|
其他特殊擴充套件功能
-
Colors
Anko為我們提供了兩種針對色彩的擴充套件功能來讓我們的程式碼更佳易讀,如:
Function Result 0xff0000.opaque
不透明的紅色 0x99.gray.opaque
不透明的#999999(灰色) -
Dimensions
你可以指定 dimension 的dip (density-independent pixels) 或sp (scale-independent pixels)值:
dip(dipValue)
或sp(spValue)
.注意textSize
屬性預設接受sp (textSize = 16f
). 使用px2dip
和px2sp
相互轉換. -
applyRecursively
applyRecursively
方法將lambda表示式應用於傳遞View
的本身,如果它是ViewGroup
,則遞迴到它的每個位元組點,例如這樣:verticalLayout { editText { hint = "Name" } editText { hint = "Password" } button("login now") { onClick { toast("login success!") } } }.applyRecursively { view -> when(view) { is EditText -> view.textSize = 20f is Button-> view.text = "點我呀~" }}
Anko Commons基礎擴充套件庫已經介紹的差不多了,怎麼樣?看完 Anko 施加在 Android 上的“魔法”,是不是迫不及待地想去大展身手了?原來程式碼還可以這樣簡潔明瞭,方便易用。哈哈,Android快速開發之Anko魔法(下篇)也將在不久於大家不見不散:smile:。
QQ交流群:601924443 歡迎Android或者kotlin愛好者加入探討交流。