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

前言

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,071评论 25 707
  • Google在今年的IO大会上宣布,将Android开发的官方语言更换为Kotlin,作为跟着Google玩儿An...
    蓝灰_q阅读 76,855评论 31 489
  • Kotlin我们也学了一些基础,但怎么用我们还是不知道?今天我们从基础转向实战,在Android平台上开发Kotl...
    Lypop阅读 10,886评论 2 6
  • 5. 最佳实践 好了终于要点讲自己的东西了,有点小激动。下面这些仅表示个人观点,非一定之规,各位看官按需取用,有说...
    SnowDragonYY阅读 2,390评论 4 36
  • fiddler札记 fiddler的简单配置 fiddler的界面简介 fiddler的状态图标
    小矮人Ethan阅读 256评论 0 0