Koltin : Anko Commons 介紹
使用 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.Log | AnkoLogger |
---|---|
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
}}