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單字

2023 最新入門零基礎 Kotlin教學【從零開始學 Kotlin 程式設計】Kotlin 教學課程目錄 (Android Kotlin, IntelliJ IDEA, Android Studio, Android APP 開發教學)

2022 最新入門零基礎 Flutter教學 【Flutter 程式設計入門實戰 30 天】Flutter 教學課程目錄 (IntelliJ IDEA 開發教學)

nano 文字編輯器

【從零開始學 Flutter 程式設計】SharedPreferences 設定檔資料存取