前言
kotlin官網(wǎng)和kotlin教程學(xué)習(xí)教程的筆記。
這一節(jié),我們引入一個新庫Anko,Anko庫可以簡化代碼,加快開發(fā)速度,是一個很強大的Kotlin庫。這里我們只需要用anko-commons就行,不需要用全庫。
一、引用anko-commons庫
1.在build.gradle中添加依賴
dependencies {
...
compile "org.jetbrains.anko:anko-commons:$anko_version"
}
2.在project下的build.gradle中添加版本號
buildscript {
...
ext.anko_version='0.10.2'
}
二、感受下Anko與kotlin的簡化
1. toast
toast("hello kotlin")
longToast("long - hello kotlin")
結(jié)合Anko的toast源碼,可以看出,這里使用了擴展函數(shù)。
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
2. alert
(1) 正常alert
alert("標題", "內(nèi)容") {
yesButton { toast("O(∩_∩)O好的") }
noButton { toast("╮(╯﹏╰)╭不好") }
}.show()
//也可以這樣
alert {
message = "內(nèi)容"
title = "標題"
positiveButton("確定") { toast("已確定") }
negativeButton("取消") { toast("已取消") }
}.show()
(2) selector alert
val fruits = listOf("apple", "orange", "banana")
selector("what do you like ?", fruits) { dialogInterface, i ->
toast("so you like ${fruits[i]} ")
}
(3) 自定義alert
alert {
customView {
val view = View.inflate(this@MainActivity,R.layout.activity_other,null)
addView(view,ViewGroup.LayoutParams(100,100))
}
}.show()
//如果我們支持了 Anko layouts庫,也可以這樣
alert {
customView {
editText()
}
}.show()
3. progress dialog
indeterminateProgressDialog("加載中").show()
4. findViewById
val recyclerView:RecyclerView = find(R.id.recyclerview)
5. intent
(1) 使用intent
使用Anko之前
val intent = Intent(this, OtherActivity::class.java)
intent.putExtra("id", 5)
intent.putExtra("name", "me")
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(intent)
使用Anko之后
startActivity(intentFor<OtherActivity>("id" to 5,"name" to "me").singleTop())
當然,如果不需要啟動模式就更簡單了
startActivity<OtherActivity>("id" to 5,"name" to "me")
| 行為 | 方式 |
|---|---|
| 打電話 | makeCall(number: String): Boolean |
| 發(fā)短信 | sendSMS(number: String, text: String = ""): Boolean |
| 調(diào)用瀏覽器 | browse(url: String, newTask: Boolean = false): Boolean |
| 分享文字 | share(text: String, subject: String = ""): Boolean |
| 發(fā)郵件 | email(email: String, subject: String = "", text: String = ""): Boolean |
(2) 常用的intent
| 行為 | 方式 |
|---|---|
| 打電話 | makeCall(number: String): Boolean |
| 發(fā)短信 | sendSMS(number: String, text: String = ""): Boolean |
| 調(diào)用瀏覽器 | browse(url: String, newTask: Boolean = false): Boolean |
| 分享文字 | share(text: String, subject: String = ""): Boolean |
| 發(fā)郵件 | email(email: String, subject: String = "", text: String = ""): Boolean |
6. log
(1) 不想輸入tag的時候,我們可以這樣,默認tag為類名
class MainActivity : Activity() , AnkoLogger {
fun method(){
debug(123)
debug { "debug{}" }
warn(null)
info("information")
}
}
當然也可以自定義tag內(nèi)容,只要重寫loggerTag方法即可。
override val loggerTag: String
get() = "myTag"
也許有人發(fā)現(xiàn)debug打印不出來,因為
Note that the log message will not be written if the current log level is above [Log.DEBUG].The default log level is [Log.INFO].
也就是說默認的等級是Log.INFO,而我們只能打印不低于默認等級的log信息,也就是當Log.isLoggable(tag, Log.INFO)為true的時候才可以打印。
至于如何更改默認等級,官網(wǎng)沒寫,也沒有查出來,如果你知道,請給我說一下,謝謝O(∩_∩)O~。
(2) 也可以作為一個對象使用
private val LOG = AnkoLogger("myTag")
private var ankoLogger = AnkoLogger(this.javaClass)
fun method(){
ankoLogger.warn { "warn use default tag" }
LOG.warn { "warn use myTag" }
}
7. color 透明度改變,增加可讀性
t1.setBackgroundColor(0x99.gray.opaque)//無透明度
t2.setBackgroundColor(0xff0000.opaque.opaque) //無透明度
t3.setBackgroundColor(0x99.gray.withAlpha(155)) //設(shè)置透明度
8. dimensions 支持各種px dp sp等的轉(zhuǎn)換,再也不用自己寫了,贊一個
var px=dip(1)
var dp = px2dip(px)
9. 更改子view
//更改alert布局中的textview的textSize
alert {
customView {
val view = View.inflate(this@MainActivity,R.layout.activity_other,null)
view.applyRecursively {
view -> when(view){
is TextView -> view.textSize=20f
}
}
addView(view,ViewGroup.LayoutParams(100,100))
}
}.show()
三、異步請求數(shù)據(jù)
請求數(shù)據(jù)之前,莫要忘記權(quán)限哦?。?!
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val url = "https://facebook.github.io/react-native/movies.json"
doAsync {
val data = getData(url)
uiThread {
showData(data)
}
}
}
fun showData(data: String) {
find<TextView>(R.id.t1).text = data
}
fun getData(url: String): String {
return URL(url).readText()
}
}
這樣子,數(shù)據(jù)便請求下來了。
uiThread可以依賴調(diào)用者,例如這里被Activity調(diào)用的,如果activity被銷毀了,那么uiThread就不會執(zhí)行,這樣就不會出現(xiàn)Activity銷毀的時候遇到崩潰的情況了。
如果我們想要返回結(jié)果,可以這樣子
val doAsyncResult = doAsyncResult{
getData(url)
}
showData(doAsyncResult.get().toString())
后記
在doAsync源碼中,
val context = AnkoAsyncContext(WeakReference(this))
可以看到這里使用了弱引用,使用強引用可能會引發(fā)內(nèi)存泄漏的問題。強引用、弱引用、軟引用、虛引用的區(qū)別與介紹點擊鏈接:
強引用、弱引用、軟引用、虛引用