美文网首页Kotlin官方文档
Kotlin for android学习十一(布局篇):anko

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

作者: crossroads | 来源:发表于2017-11-06 17:04 被阅读53次

    前言

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

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

    相关文章

      网友评论

        本文标题:Kotlin for android学习十一(布局篇):anko

        本文链接:https://www.haomeiwen.com/subject/jnwtmxtx.html