Kotlin官方文档

Kotlin for android学习十一(布局篇):anko

2017-11-06  本文已影响53人  crossroads

前言

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))

可以看到这里使用了弱引用,使用强引用可能会引发内存泄漏的问题。强引用、弱引用、软引用、虚引用的区别与介绍点击链接:
强引用、弱引用、软引用、虚引用

上一篇下一篇

猜你喜欢

热点阅读