Talk is cheap, let’s code
前面一篇文章介绍Kotlin的基础知识,但光有知识是不够的,最重要的是要能在实战中使用Kotlin,这才不枉我们学习一回。这里就用纯Kotlin来开发一个简单的Android应用,以展示如何在实际项目中使用Kotlin。
走上Kotlin开发之路
在前面文章的尾部,我们展示了如何创建一个基于Kotlin安卓应用,但是过于简单,因为仅是代码换成了Kotlin,布局还是在用XML,这并没有用到Kotlin的全部。为了更加方便的开发Android应用,发挥Kotlin语言的巨大优势,JetBrains在发布Kotlin的同时,也发布一个专门用于Android开发的配套的库Anko,它最大的优势就是以DSL的方式来创建UI,下面我们来介绍一下Anko。
Anko
Anko是什么鬼,以及为何要用它
Anko库的目的是提高Android开发的效率,用Kotlin语言的优势。它有四大部分:Anko commons,Anko layouts,Anko SQLite和Anko Coroutines,这里我们不复制官方的介绍了,关于这四部分可以看一下官方的wiki。 其实,最大的变化就是布局,常规的Android项目,我们一般都是用XML来写布局XML呢,其实也没有啥大问题,在各种开发工具和开源库的帮忙下,效率也不低,但XML最大的问题就是啰嗦,要不然现在也不会被JSON取代。 当然,我们可以像前面的KotlinHello,显示的那样,布局使用XML,代码使用Kotlin,这没有任何问题,但Kotlin语言最大的特点是简洁,所以,使用Anko可以,非常简洁的,用更少的代码来实现同样的功能,代码少了,效率也就高了。
如何使用Anko
重写KotlinHello,来展示一下如何在项目中使用Anko,继续打开上篇文章中的KotlinHello项目,在app下面的build.gradle中的dependencies中添加:
|
|
在其顶部定义anko_version变量:
|
|
重新gradle sync一下,完成后,就可以使用了。
编辑HelloActivity.kt,在onCreate里面,把除了super.onCreate以外的都删除,然后添加:
|
|
运行起来,就是这个样子的:
页面有点丑,稍美化下,展示如何添加布局的属性:
|
|
最终就是这个样子了:
贴下完整代码: app/build.gradle:
|
|
HelloActivity.kt:
|
|
实战,撸一个程序猿老黄历
一个KotlinHello,还是过于toy,我们再来一个稍复杂点的小项目,以练手,考虑到Kotlin带来最大变化就是用Anko来写布局,所以我们弄个布局稍复杂的,所以,可以撸一个程序猿老黄历,它功能比较简单,主要就是布局,又不涉及网络,所以适合初学者练手。
需求理解
动手之前,先理解一下需求。我们要撸的是这个版本的程序员老黄历。 原理呢很简单,预定义一些事件,工具,饮品,方位等,然后用当前日期算出一个随机index,从预定义中取出一批,然后展示出来。其实呢,对于逻辑部分的代码,我们照抄就好,不用太关心。重点,是布局如何用Anko来实现。
上手开撸
- 新建一个package: calendar
- 在calendar中新建一个empty activity: CalendarActivity
|
|
- 点击KotlinHello中的button时,跳到CalendarActivity
|
|
- 开始撸布局 整体布局分五块:头部的日期,宜事抬头,宜事详细,坏事抬头,坏事详细,底部方向和指数。这其中,头部日期,可以用一个TextView来解决。宜和坏,是一样的,可以复用,宜(坏)事详细是一个列表,底部也是一个列表,但因为数目和每条内容是固定的,所以可以用三个View来解决。
总结:
- 根布局要是一个ScrollView,因为如果内容多时,或者屏幕太小时,可能会有超出屏幕的地方,所以根布局要能滑动。
- 中间好/坏, 以及好坏的具体事件,要用一个LinearLayout把两个包起来,因为好/坏的高度是由具体事件决定的,又要填充背景色,所以包上一层LinearLayout不可避免。
- 这样一来,从上到下,一个LinearLayout就可以了
运行效果
最终运行效果:
最终代码
CalendarActivity,负责布局和展示
|
|
ProgrammerCalendar,这里是业务逻辑
|
|
完整的代码可以到这里下载。
用到的新特性
从代码中看到,除了上一篇文章外,还用到了一些Kotlin语言的特性:
Ranges
可以理解为区间,用于按某些范围来迭代,看一下例子中genTodayLuck方法就能明白。下面也简单的补充下:
|
|
自己可以体会上面的两个不同,还有就是还可以用于if判断:
|
|
默认步长是1, 当然也可以自定义:
|
|
Extension function
可以给已存在的类添加方法,非继承也非组合的方式,与Object-C中的Category很像。这会让在基于某个类,执行某种操作时,非常的简洁,比如此例中的pickRandom方法,如果常规实现是把列表作为一个参数传入,但是用了Extension function后,使用的时候就仿佛这是Collection本身提供的一个方法一样,可读性与简洁性大大提升。
Companion object
与内部类概念类似,就是想在一个类的内部再声明一个类,就要用companion object,引用companion object的成员时可以省略它的类的名字,如示例中,在CalendarActivity中引用ProgrammerCalendar的companion object EventKeys时可以省略:
|
|
const关键字
上一篇文章,介绍过变量用var声明,常量用val来声明,那关键字const又是什么鬼呢?原来它用于声明类的顶级属性(用人话说,就是非内部类),其作用相当于Java中的static final:
|
|