kotlin的伴生庫-anko迭代了已經(jīng)多個版本了,但是目前網(wǎng)上的資源主要集中在官方說明的機械翻譯或者舊博客的復(fù)制/粘貼上。
本文帶大家全方位的熟悉anko庫的使用。anko庫目前主要有四個核心庫
- anko-commons庫,一些通用功能,集成方式:
dependencies {
//anko_version腳本配置,下同,本文中,該值為0.10.0
compile "org.jetbrains.anko:anko-commons:$anko_version"
}
- anko-layout庫,牛逼的dsl(領(lǐng)域特定語言)功能,布局的另一種代碼方式,相對比較簡潔,xml的簡易替代。集成方式:
dependencies {
// Anko Layouts
compile "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also available
compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version"
// 主要為兼容一些控件事件的協(xié)程,不過協(xié)程coroutines目前還不是kotlin的正式內(nèi)容
compile "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"
compile "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"
}
- anko-coroutines庫,集成方式:
dependencies {
compile "org.jetbrains.anko:anko-coroutines:$anko_version"
}
- anko-sqlite庫,見名知義,簡化sqlite使用的庫,集成方式:
dependencies {
compile "org.jetbrains.anko:anko-sqlite:$anko_version"
}
本篇主要介紹commons庫和layout庫的使用
這里先附上demo工程鏈接,喜歡的記得點個star哦。
- 跳轉(zhuǎn)activity并傳遞參數(shù),這些參數(shù)是作為extra屬性傳遞過去的,%Context/Fragment類擴展函數(shù)%
//啟動
startActivity<IntentActivity>("name" to "小明", "age" to 12)
//IntentActivity接收參數(shù)
var name = intent.extras.getString("name")
var age = intent.extras.getInt("age")
//若有其它設(shè)置,則&intentFor方法&構(gòu)建intent
startActivity(intentFor<IntentActivity>("name" to "小紅", "age" to 13).singleTop())
- 快捷 瀏覽器,發(fā)短信,分享,發(fā)郵件操作,%Context/Fragment類擴展函數(shù)%
browse("http://m.baidu.com")
- 增強log輸出,目前發(fā)現(xiàn)的最大好處是支持list和map,整數(shù),空,自定義數(shù)據(jù)類等類型的打印。缺點是1-名稱略長,tag設(shè)置不太靈活,不過tag設(shè)置也無所謂,畢竟log查看/過濾完全可以不用tag。2-使用略麻煩,要么實現(xiàn)AnkoLogger 類,要么拿到AnkoLogger<SomeActivity>(this)變量,然后調(diào)用方法,不過完全可以寫個方法封裝,全局共用,具體demo有。
verbose("tag-默認為調(diào)用類")//貌似不會打印,原因暫時未知
debug(110)//貌似不會打印,原因暫時未知
warn(null)
info(listOf<String>("today", "is", "a", "fine", "day"))
error(HashMap<String, String>().apply {
put("小明", "12")
put("小紅", "13")
})
warn(CData("data", 100))
...
這里可結(jié)合一種優(yōu)雅打log的方式,定制一份很強大的log方式,記得模板要聲明kotlin的applicable,比如
error("$method$($file$:$line$)\r\n -"+$text1$)
- Dimensions類,重要的方法主要是單位換算,%Context/Fragment/View類擴展函數(shù)%
dip(100)//dp->px
px2dip(100)//px->dp
- Helper類,重要的方法主要有三個,挺實用的
//實用的attempt函數(shù),{}若正常執(zhí)行,則value返回{}的返回值,
//若{}執(zhí)行有異常,并不會閃退,只是會設(shè)置個error屬性。很好的try..catch替代方案
attempt { 3 }.value//結(jié)果3
attempt { 1 / 0 }.error
//還有sdk版本相關(guān)的
doFromSdk(21) {
info("從api 21開始打印")
}
doIfSdk(21) {
//獲得版本名也簡單的多
packageManager.getPackageInfo(packageName, 0).versionName
info("只有api 21才打印")
}
- 對話框的優(yōu)雅彈出,%Context/Fragment類擴展函數(shù)%
alert("this is the msg") {
customTitle {
verticalLayout {//用到了anko-layout庫
imageView(R.mipmap.ic_launcher)//方便的設(shè)置內(nèi)容
editText { hint = "hint_title" }
}
}
okButton { toast("button-ok") }
cancelButton { toast("button-cancel") }
}.show()
- 列表selector的優(yōu)雅實現(xiàn),%Context/Fragment類擴展函數(shù)%
val countries = listOf("Russia", "USA", "England", "Australia")
selector("Where are you from?", countries) { ds, i ->
toast("So you're living in ${countries[i]}, right?")
}
--其它的一些常用屬性,代碼能簡潔不少,%Context/Fragment類擴展函數(shù),有的是AnkoContext的類擴展屬性%
displayMetrics,defaultSharedPreferences,act
assets,ctx,contentView,resources//基本見名知義吧,不介紹了
bundleOf("name" to "test")//just show bundle,return Bundle對象
toast(".."'),progressDialog()..//使用很簡單
以上,commons庫的使用介紹完畢,應(yīng)該是比較全了。
下面介紹layout庫,網(wǎng)上有關(guān)這個的庫的介紹比較多,主要是dsl比較cool比較潮吧,不過目前這個對簡答的布局比較適用,復(fù)雜的還真不好說。權(quán)當語法糖熟悉下。這里盡量只列代碼和使用,還有一些網(wǎng)上少見的用法。
- 先上個常規(guī)的用法,需要注意的點是find<Button>(BTN_ID),可以在dsl外部獲得指定view
verticalLayout {
padding = dip(30)
editText {
hint = "Name"
textSize = 24f
}
editText {
hint = "Password"
textSize = 24f
}
button("Login") {
textSize = 26f
id = BTN_ID
}
}
//note
//id findview
find<Button>(BTN_ID).setOnClickListener { toast("this is login button") }
- 布局不該放到activity中吧,否則那樣太亂了,所以第二種方案來了:
//聲明一個類繼承AnkoComponent,對應(yīng)泛型類到一個LayShowActivity,然后布局
class LayoutActyUI : AnkoComponent<LayShowActivity> {
val ET_ID = 0x1001
override fun createView(ui: AnkoContext<LayShowActivity>) = with(ui) {
verticalLayout {
val name = editText("LayoutActyUI") {
id = ET_ID
}
button("Say Hello") {
onClick {
ctx.toast("Hello, ${name.text}!")
name.textColor = 0xffff0000.toInt()
}
}
}
}
}
//然后在LayShowActivity調(diào)用下面的方法即可實現(xiàn)加載布局
LayoutActyUI().setContentView(this)
- 引入布局參數(shù)和一些多函數(shù)控件事件監(jiān)聽器的簡潔使用,具體解釋見注釋
verticalLayout {
button("seekbar") {
textSize = 26f
}.lparams(width = wrapContent) {//布局參數(shù)
horizontalMargin = dip(15)
topMargin = dip(20)
}
editText {
hintResource = R.string.app_name//直接引用資源文件內(nèi)容的方式
textChangedListener {多函數(shù)事件簡單寫法
onTextChanged { str, start, before, count ->
ai(str)
}
}
}
}
這里補充下函數(shù)控件事件監(jiān)聽器,比如:
//原java方式用法,必須傳入TextWatcher對象作為參數(shù),而且有些函數(shù)根本用不上,比較麻煩。
EditText(act).addTextChangedListener(object :TextWatcher{
override fun afterTextChanged(s: Editable?) {
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
})
//現(xiàn)在只需利用anko庫的這個寫法,使代碼大大減少且清晰
EditText(act).textChangedListener {
onTextChanged { str, start, before, count ->
ai(str)//log..info
}
}
onClick{},onCheckedChange{},onDateChange{}
onDrawerOpen{},onItemClick{},onScrollChange{}等等都有類似用法
好了,本篇就介紹到這,下篇會對另兩個子庫做個比較全面的介紹。
附上demo工程鏈接,喜歡的記得點個star哦。
作者劉咸尚