前言
kotlin官網(wǎng)和kotlin教程學(xué)習(xí)教程的筆記。
這一節(jié)砾肺,我們引入一個(gè)新庫Anko,Anko庫可以簡(jiǎn)化代碼防嗡,加快開發(fā)速度变汪,是一個(gè)很強(qiáng)大的Kotlin庫。這里我們只需要用anko-commons就行蚁趁,不需要用全庫裙盾。
一、引用anko-commons庫
1.在build.gradle中添加依賴
dependencies {
...
compile "org.jetbrains.anko:anko-commons:$anko_version"
}
2.在project下的build.gradle中添加版本號(hào)
buildscript {
...
ext.anko_version='0.10.2'
}
二他嫡、感受下Anko與kotlin的簡(jiǎn)化
1. toast
toast("hello kotlin")
longToast("long - hello kotlin")
結(jié)合Anko的toast源碼,可以看出番官,這里使用了擴(kuò)展函數(shù)。
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
2. alert
(1) 正常alert
alert("標(biāo)題", "內(nèi)容") {
yesButton { toast("O(∩_∩)O好的") }
noButton { toast("╮(╯﹏╰)╭不好") }
}.show()
//也可以這樣
alert {
message = "內(nèi)容"
title = "標(biāo)題"
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())
當(dāng)然鲤拿,如果不需要啟動(dòng)模式就更簡(jiǎn)單了
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的時(shí)候,我們可以這樣,默認(rèn)tag為類名
class MainActivity : Activity() , AnkoLogger {
fun method(){
debug(123)
debug { "debug{}" }
warn(null)
info("information")
}
}
當(dāng)然也可以自定義tag內(nèi)容署咽,只要重寫loggerTag方法即可。
override val loggerTag: String
get() = "myTag"
也許有人發(fā)現(xiàn)debug打印不出來生音,因?yàn)?/p>
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].
也就是說默認(rèn)的等級(jí)是Log.INFO宁否,而我們只能打印不低于默認(rèn)等級(jí)的log信息,也就是當(dāng)Log.isLoggable(tag, Log.INFO)為true的時(shí)候才可以打印缀遍。
至于如何更改默認(rèn)等級(jí)慕匠,官網(wǎng)沒寫,也沒有查出來域醇,如果你知道台谊,請(qǐng)給我說一下蓉媳,謝謝O(∩_∩)O~。
(2) 也可以作為一個(gè)對(duì)象使用
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)換酪呻,再也不用自己寫了,贊一個(gè)
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()
三盐须、異步請(qǐng)求數(shù)據(jù)
請(qǐng)求數(shù)據(jù)之前玩荠,莫要忘記權(quán)限哦!T舻恕阶冈!
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ù)便請(qǐng)求下來了塑径。
uiThread可以依賴調(diào)用者女坑,例如這里被Activity調(diào)用的,如果activity被銷毀了统舀,那么uiThread就不會(huì)執(zhí)行匆骗,這樣就不會(huì)出現(xiàn)Activity銷毀的時(shí)候遇到崩潰的情況了。
如果我們想要返回結(jié)果绑咱,可以這樣子
val doAsyncResult = doAsyncResult{
getData(url)
}
showData(doAsyncResult.get().toString())
后記
在doAsync源碼中绰筛,
val context = AnkoAsyncContext(WeakReference(this))
可以看到這里使用了弱引用,使用強(qiáng)引用可能會(huì)引發(fā)內(nèi)存泄漏的問題描融。強(qiáng)引用铝噩、弱引用、軟引用窿克、虛引用的區(qū)別與介紹點(diǎn)擊鏈接:
強(qiáng)引用骏庸、弱引用、軟引用年叮、虛引用