帶你全方位使用Anko庫-上篇

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哦。

作者劉咸尚

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評論 25 709
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,253評論 6 342
  • 1. 經(jīng)過某個咖啡廳,經(jīng)過某個石板凳,你都會情不自禁地想著,有沒有機會能夠遇見他呢? 當你把他落下的東西寄回去給他...
    佳人有夢閱讀 1,148評論 0 0

友情鏈接更多精彩內(nèi)容