写了很多代码,却发现它们干不了多少事情,终究还是会苦恼的。比如我一直比较痛苦的一件事儿就是:

Button button = (Button) findViewById(R.id.btn);

如果我需要很多个按钮和图片,那么我们要写一大片这样的 findViewById。。妈呀。。。这活我干不了啦。。

不过用 Kotlin 的 Android 扩展插件,我们就可以这样:

先上布局文件:

main.xml

在 Activity 中:

注意到:

importkotlinx.android.synthetic.main.load_activity.*

导入这一句之后,我们就可以直接在代码中使用 start、textView,他们分别对应于 main.xml 中的 id 为 start 的按钮和 id 为 textView 的 TextView。

于是你就发现你再也不用 findViewById 了,多么愉快的一件事!!!当然,你还会发现 Toast 的调用也变得简单了,那其实就是一个扩展方法 toast();而 startActivity 呢,其实就是一个 inline加reified 的应用——这我们前面都提到过了。

还有一个恶心的东西就是 UI 线程和非 UI 线程的切换问题。也许你会用 handler 不断的 post,不过说真的,用 handler 的时候难道你不颤抖么,那可是一个很容易内存泄露的魔鬼呀~哈哈,好吧其实我不是说这个,主要是用 handler 写出来的代码 实在 太 丑 了 !!

原来在 Java 当中,我们这么写:

而在 Kotlin 当中呢,我们只需要这么写:

自己感受一下吧。

下面我们再来提一个有意思的东西,我们从做 Android 开发一开始就要编写 xml,印象中这个对于我来说真的是一件痛苦的事情,因为它的工作机制并不如代码那样直接(以至于我现在很多时候居然喜欢用 Java 代码直接写布局)——当然,最主要的问题并不是这个,而是解析 xml 需要耗费 CPU。Kotlin 有办法可以解决这个问题,那就是 DSL 了。下面给出一个例子:

一个 LinearLayou t包含了一个 Button,这段代码你可以直接写到你的代码中灵活复用,就像这样:

这样做的好处真是不少:

比起 xml 的繁琐来,这真是要清爽很多

布局本身也是代码,可以灵活复用

再也不用 findViewById 了,难道你不觉得在这个上面浪费的生命已经足够多吗

事件监听很方便的嵌到布局当中

DSL 方式的布局没有运行时的解析的负担,你的逻辑代码怎么运行它就怎么运行。