寫在前面
JetBrains在給我們帶來Kotlin的同時,也給我們帶來了一個可以讓你的Android應(yīng)用變得更簡單,更便捷的庫-----Anko(https://github.com/Kotlin/anko),初識Anko,很多地方還不太理解,目前只接觸了Anko Layouts,覺得相見恨晚.
本文代碼已上傳至https://github.com/Xxxxxxyk/DouCat/tree/xyk
用Anko寫布局
Android中的布局有兩種書寫方式,一種是在代碼里寫,不過至今為止我還沒見過記過,第二種就是用XML書寫,但是傳統(tǒng)的XML書寫布局,一旦遇上復(fù)雜截面,會導(dǎo)致onCreate方法執(zhí)行緩慢,高耗電,大部分代碼無法復(fù)用等痛點,在Kotlin中,這些痛點不復(fù)存在,官方稱之為Anko DSL,在github給出了一個例子:
DSL (Domain Specific Language)
領(lǐng)域相關(guān)語言
https://en.wikipedia.org/wiki/Domain-specific_language
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
很簡單的一個布局,點擊按鈕用吐司彈出文本框內(nèi)容,為了對比,我們把這個布局用傳統(tǒng)的Java寫出來:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Say Hello!"/>
</LinearLayout>
光布局就超過了不知道多少行代碼,立馬高下立判.
擴展
上面只是一個簡單的例子,接下來可以嘗試寫一個復(fù)雜一些的布局進行練手
relativeLayout {
toolbar {
id = ViewID.TOOL_BAR
title = ""
backgroundResource = R.color.colorPrimary
relativeLayout {
imageView {
imageResource = R.mipmap.logo_icon
}.lparams(width = 200) {
height = 120
}
linearLayout {
orientation = LinearLayout.HORIZONTAL
gravity = Gravity.CENTER_VERTICAL
imageView {
imageResource = R.drawable.img_message
isClickable = true
}.lparams(width = 60, height = 60) { rightMargin = 35 }
imageView {
imageResource = R.drawable.img_history
isClickable = true
}.lparams(width = 60, height = 60) { rightMargin = 35 }
imageView {
imageResource = R.drawable.img_scanner
isClickable = true
}.lparams(width = 60, height = 60) { rightMargin = 35 }
imageView {
imageResource = R.drawable.img_search
isClickable = true
}.lparams(width = 60, height = 60) { rightMargin = 35 }
}.lparams(height = matchParent) {
width = wrapContent
alignParentRight()
}
}
}.lparams(width = matchParent) {
height = 120
}
frameLayout {
id = ViewID.FL_FRAGMENT
}.lparams(width = matchParent, height = matchParent) {
below(ViewID.TOOL_BAR)
above(ViewID.BNV_BOTTOM)
}
bnv_btn = bottomNavigationView {
id = ViewID.BNV_BOTTOM
backgroundColor = android.R.attr.windowBackground
inflateMenu(R.menu.navigation)
}.lparams(width = matchParent) {
height = wrapContent
alignParentBottom()
}
}
}
上面的布局中用到的Android Support Library 25中的新增控件BottomNavigationView,這個控件在Anko中默認是不被支持的,可以通過非常簡單的兩句代碼,讓Anko對該控件進行支持,同理也適用于自定義控件:
//讓Anko支持BottomNavigationView
public inline fun ViewManager.bottomNavigationView(theme: Int = 0) = bottomNavigationView(theme) {}
public inline fun ViewManager.bottomNavigationView(theme: Int = 0, init: BottomNavigationView.() -> Unit) = ankoView({ BottomNavigationView(it) }, theme, init)
加入上面兩行代碼,就可以在Anko中使用自定義控件了.
預(yù)覽Anko Layout
我們在用Anko編寫布局時會發(fā)現(xiàn),不像以往用XML編寫布局時支持預(yù)覽,造成了想預(yù)覽布局就需要運行一次,但是這么一個優(yōu)秀的庫怎么會沒有解決辦法呢,可以在File -> Setting -> Plugins中安裝 Anko Support插件,安裝完成后重啟Android Studio,開啟下面選項即可進行預(yù)覽布局,目前只支持2.4版本,3.0版本不支持.
此處沒有預(yù)覽布局成功配圖,因為我的就是Android Studio 3.0 ..........
結(jié)尾
最近看了沈騰的羞羞的鐵拳,被一首老歌洗腦了........