Koltin : Anko Commons 介紹

從零開始學 Kotlin 程式設計: 線上教學課程目錄
Android , Kotlin , 開發 , 教學 , 範例 , 入門 , 基礎 , 新手 , 程式設計 , 課程

使用 Anko Commons

在 module 層級中的 的 Gradle ,中宣告 dependencies:
dependencies {
    implementation "org.jetbrains.anko:anko-commons:$anko_version"
}
在 APP 層級中的 Gradle 宣告,使用版本:
ext.anko_version='0.10.8'
可以在這裡看到 Anko 最新版本: 點我

Intents

未使用 Anko,原本 Kotlin 寫法

//使用 SINGLE TOP 方式,跳頁到 BActivity,並且帶一個id值為5
val intent = Intent(this, BActivity::class.java)
intent.putExtra("id", 5)
intent.setFlag(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(intent)

使用 Anko 寫法

startActivity(intentFor<BActivity>("id" to 5).singleTop())
如果沒有 singleTop ,可以寫成:
 startActivity<BActivity>()
如果你有很多參數要帶到 BActivity ,可以寫成:
startActivity<BActivity>(
"id" to 5,
"city" to "Denpasar",
"lat" to 25.037531f, //浮點數,最後要加一個f,不然下一頁解析值會為0
"state" to true
)
BActivity 要獲取上一頁帶過來的參數(Anko 沒有簡化喲,仍為此原Koltin寫法):
val bundle = intent.extras
val id: Int
val city: String
val lat: Float
val state: Boolean
if (bundle != null) {
    id = bundle.getInt("id")
    city = bundle.getString("city")
    lat = bundle.getFloat("lat")
    state = bundle.getBoolean("state")
}

Intent 電話相關功能

使用電話相關功能,除了在 AndroidManifest.xml 宣告使用電話權限外也要 獲取使用者同意(Android 6 以上),才能正常使用電話功能喔
//打電話
makeCall("電話號碼")

//傳送簡訊
sendSMS("電話號碼", "要傳送的簡訊文字")

//使用瀏覽器開啟網頁
browse("網址")

//分享文字
share("文字內容", "標題")

//傳送email
email("email", "標題", "文字內容")

Toasts

未使用 Anko,原本 Kotlin 寫法

//短時間顯示
Toast.makeText(this, "message", Toast.LENGTH_SHORT).show()
//長時間顯示 
Toast.makeText(this, "message", Toast.LENGTH_LONG).show()

使用 Anko 寫法

//短時間顯示
toast("message")
toast(R.string.message)

//長時間顯示 
longToast("message")

SnackBars

原本 SnackBar 的 Kotlin 寫法

Snackbar.make(root_view, "massage", Snackbar.LENGTH_LONG).setAction("action") {
            toast("Demo Snackbar...")
        }.show()
其中的 root_view 指的是該頁,最外層 Parent layout 的 id 為 root_view。而使用 snackbar 時官方建議最外層使用 CoordinatorLayout,較不影響 snackbar 出現提示導致頁面跑版問題。
若要使用 Anko 的 SnackBar 要在 module 層級中的 Gradle,加入 anko-design 依賴宣告
dependencies {
    compile "org.jetbrains.anko:anko-commons:$anko_version"
    compile "org.jetbrains.anko:anko-design:$anko_version" // For SnackBars
}

使用 Anko 寫法

//短時間顯示
root_view.snackbar("Hi there!")

////長時間顯示
root_view.longSnackbar("Wow, such duration")

//多一個按鈕,點擊此按鈕後,可以去觸發要做的事件
root_view.snackbar("Action, reaction", "Click me!") { doStuff() }

Alerts

使用 Anko 寫法

//純訊息內容
alert("訊息內容").show()

//標題+訊息內容
alert("訊息內容", "標題").show() 

//多一個確定按鈕,可以去觸發要做的事件
alert("訊息內容", "標題") {
    yesButton { toast("Demo Alerts …") }
}.show()


//多確定與取消事件按鈕,分別可以去觸發要做的事件
alert("訊息內容", "標題") {
    yesButton { toast("Demo Alerts yesButton…") }
    noButton {}
}.show()

Selectors

使用 Anko 寫法

val my_class = listOf("Android", "iOS", "PHP", "Python")

selector("你想報名的課程:", my_class) { ds, i ->
    toast("你選擇 ${my_class[i]}")
}

Progress dialogs

使用 Anko 寫法

//顯示轉圈圈樣式,目前正在進行中
val dialog1 = indeterminateProgressDialog(message = "請稍候…", title = "國際交易匯款中...")


//顯示目前百分比進度條樣式
val dialog2 = progressDialog(message = "請稍候…", title = "國際交易匯款中...")
//設定進度條百分比
dialog2.progress = 80

Logging

一般使用 log 與 AnkoLogger 對照表

android.util.LogAnkoLogger
v()verbose()
d()debug()
i()info()
w()warn()
e()error()
wtf()wtf()

使用 Anko 寫法

使用 Anko 的 TAG 名,默認它會使用用類別名作爲 TAG名。
class SomeActivity : AppCompatActivity(), AnkoLogger {
    private fun someMethod() {
        info("除錯資訊")
        debug(5) // .toString() method will be executed
        warn(null) // "null" will be printed
    }
}

Colors

opaque、withAlpha 兩個擴充函數,方便設定透明度屬性
tv1.setBackgroundColor(0x99.gray.opaque)//無透明度
tv2.setBackgroundColor(0xff0000.opaque.opaque) //無透明度
tv3.setBackgroundColor(0x99.gray.withAlpha(155))  //設定透明度

dimensions

anko 提供 px、dp、sp 轉換方式

若用程式設定文字大小(tv.textSize),需要進行單位轉換,根據螢幕解析度來進行變化。轉換方法,已經包含在 Anko Commons 中,不用自己在維護一套。
//dip to px
var px=dip(1)

//px to dip
var dp = px2dip(px)

//px to sp
var sp = px2sp(10)        

applyRecursively

可用来設定子View的樣式相關屬性(字體大小、顏色…等)
verticalLayout {
    editText {
        hint = "Name"
    }
    editText {
        hint = "Password"
    }
}.applyRecursively { view -> when(view) {
    is EditText -> view.textSize = 20f
}}

參考資料

留言

這個網誌中的熱門文章

16天記下7000單字