Kotlin for android学习十一(布局篇):anko
前言
kotlin官网和kotlin教程学习教程的笔记。
这一节,我们引入一个新库Anko,Anko库可以简化代码,加快开发速度,是一个很强大的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")
结合Anko的toast源码,可以看出,这里使用了扩展函数。
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
2. alert
(1) 正常alert
alert("标题", "内容") {
yesButton { toast("O(∩_∩)O好的") }
noButton { toast("╮(╯﹏╰)╭不好") }
}.show()
//也可以这样
alert {
message = "内容"
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 |
发短信 | sendSMS(number: String, text: String = ""): Boolean |
调用浏览器 | browse(url: String, newTask: Boolean = false): Boolean |
分享文字 | share(text: String, subject: String = ""): Boolean |
发邮件 | email(email: String, subject: String = "", text: String = ""): Boolean |
(2) 常用的intent
行为 | 方式 |
---|---|
打电话 | makeCall(number: String): Boolean |
发短信 | sendSMS(number: String, text: String = ""): Boolean |
调用浏览器 | browse(url: String, newTask: Boolean = false): Boolean |
分享文字 | share(text: String, subject: String = ""): Boolean |
发邮件 | 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内容,只要重写loggerTag方法即可。
override val loggerTag: String
get() = "myTag"
也许有人发现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的时候才可以打印。
至于如何更改默认等级,官网没写,也没有查出来,如果你知道,请给我说一下,谢谢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)) //设置透明度
8. dimensions 支持各种px dp sp等的转换,再也不用自己写了,赞一个
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()
三、异步请求数据
请求数据之前,莫要忘记权限哦!!!
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()
}
}
这样子,数据便请求下来了。
uiThread可以依赖调用者,例如这里被Activity调用的,如果activity被销毁了,那么uiThread就不会执行,这样就不会出现Activity销毁的时候遇到崩溃的情况了。
如果我们想要返回结果,可以这样子
val doAsyncResult = doAsyncResult{
getData(url)
}
showData(doAsyncResult.get().toString())
后记
在doAsync源码中,
val context = AnkoAsyncContext(WeakReference(this))
可以看到这里使用了弱引用,使用强引用可能会引发内存泄漏的问题。强引用、弱引用、软引用、虚引用的区别与介绍点击链接:
强引用、弱引用、软引用、虚引用