下面是我抄的 Anko - GitHub 上面的描述
Anko is a Kotlin library which makes Android application development faster and easier. It makes your code clean and easy to read, and lets you forget about rough edges of the Android SDK for Java.
Anko consists of several parts:
1 | Anko Commons: a lightweight library full of helpers for intents, dialogs, logging and so on; |
Commons
1 | compile "org.jetbrains.anko:anko-commons:$anko_version" |
Commons
库就类似于我们的快速开发框架,在一些基础 API
的基础上进一步封装,达到更加简化的目的。
Intent
对 Intent
的扩展,大大简化构造 Intent
的过程
1 | // 打开 Activity |
针对一些 Intent
的常用操作,也做了封装
1 | // 打电话-需要申请权限 |
UI Extension
显示 Toast
1 | toast("toast msg") |
显示 AlertDialog
1 | alert(Appcompat, "message", "title") { |
显示选择列表的 Dialog
1 | selector("selector", listOf("1", "2", "3")) { dialog, index -> |
显示 ProgressDialog
1 | progressDialog("message", "title") { |
Log
创建 log
打印
1 | // tag 为 TestCommonsActivity |
输出日志,支持函数计算,这样可以在输出的再计算相关的值
1 | logger.verbose { "lazy calculate verbose msg" } |
Misc
将颜色转化为非透明色,alpha
部分会被转换为 ff
1 | 0x00ff0000.opaque |
灰化,将给的颜色单一色值进行灰化,红绿蓝三部分会变成相同的色值,但是最好使用一个色值的两位,它使用了移位运算,不然结果会有点混乱
1 | // 将会返回 0xff999999 |
尺寸转换
1 | // sp 转 px |
递归遍历所有 child view
,这边需要结合一点 Layouts
框架的内容,用于最后对 View
进行设置
1 | verticalLayout { |
简化版本的 findViewById()
1 | textView(R.string.app_name){ |
在 Activity
和 Fragment
中可以直接使用 ctx
和 act
来访问上下文。
1 | // context |
Layouts
Layouts
框架最大的亮点就是 DSL(Domain Specific Language)
,领域专用语言,它提供了一种新的构建 UI
的方式,为什么要使用 DSL
,下文摘自 GitHub
1 | By default, UI in Android is written using XML. That is inconvenient in the following ways: |
使用传统的 xml
构建方式,使用起来真的很简单,还有实时预览,但是同样有很多缺点,比如类型安全,空安全,不能进行声明数据访问数据,xml
的解析浪费了大量性能等,而如果使用代码编写 UI
,简直痛苦死,但是使用 DSL
可以避免这些问题,而且还有插件支持实时预览,还有什么理由拒绝呢?
添加依赖,发现 com.google.android
无法下载,因此过滤掉,另外需要注意的是如果依赖了 kotlin
协程官方的扩展库,需要删除掉,否则版本不同可能会出问题。
1 | // 不需要重复依赖 |
使用 Layouts
需要以下依赖
1 | // Anko Layouts // sdk15, sdk19, sdk21, sdk23 are also available |
Basics
不再需要 setContentView()
1 | override fun onCreate(savedInstanceState: Bundle?) { |
使用 DSL
布局,用起来和 xml
相差不大,借助代码的缩进可以清晰的想象出布局的样式,支持 Android
所有的控件。
1 | verticalLayout { |
控件属性和 LayoutParams
声明控件的属性,控制控件的绘制显示,在创建控件时会传入一个初始化函数,在该函数中可以进行控件属性的初始化,写过 xml
这些属性用起来其实没什么太大差别,学习成本不高,同样每个属性都会对应一个使用 resource
的方法,用来兼容使用 xml
声明的 string
,color
等,来避免硬编码。
1 | verticalLayout { |
设置 LayoutParams
,他用来表示该控件在父布局中绘制显示
1 | textView("textview") { |
RelativeLayout
别的布局不用多说,控件之间的依赖相对简单,针对 RelativeLayout
要复杂一些,在 Anko
中可以类似 xml
中一样,使用相似的语法依赖其他控件的 id
,也可以直接依赖控件引用,当然里面的原理还是根据 id
依赖。
关于 id
,无法像 xml
中可以自动生成,所以要么使用 val ID_VIEW = 100
这样的形式声明,要么使用 resources
的方式,推荐后面一种,如下:
1 | <resources> |
ps:就算是依赖控件的引用,也必须为控件声明
id
,因为内部原理还是使用id
依赖,没有id
会异常。
使用 RelativeLayout
布局
1 | relativeLayout { |
Theme
对每个控件都有一个 themedXXXX
的实现,支持使用 R.style.xxx
来初始化
1 | <style name="MyTv"> |
使用 theme
创建
1 | verticalLayout { |
Listeners
为控件设置监听,所有监听默认支持协程,这意味着你可以在监听中直接执行异步任务,还有一个优势就是实现一个监听时不再要实现所有方法。
1 | // 在监听之中直接执行耗时操作 |
Extends
在 DSL
中支持扩展使用自定义控件
1 | class MyView(context: Context?) : TextView(context) |
这样在 DSL
中就可以使用
1 | verticalLayout { |
Include
包含 layout.xml
文件,使用 include
,范型决定了在函数中你可以使用的类型
1 | verticalLayout{ |
Convert
转换 xml
-> DSL
1 | Code -> Covert to Anko Layouts DSL |
Component
使用 AnkoComponent
可以让我们将 UI
部分单独的独立出来,而不是挂在 Activity
生命周期方法中国,可以让代码更清晰
1 | class SplashActivityUI : AnkoComponent<SplashActivity> { |
然后在 Activity
的 onCreate()
方法中添加布局
1 | SplashActivityUI().setContentView(this) |
使用 AnkoComponent
不止可以将 Activity
中的布局分离出来,他其实是一种对布局代码进行解耦复用的方法,我们也可以用它来加载 RecyclerView
的 item
Coroutines
Coroutines
框架是基于 kotlinx-coroutine
框架的扩展,在此基础上针对 Android
做了简化。
1 | compile "org.jetbrains.anko:anko-coroutines:$anko_version" |
asReference
这个主要用来避免如果你在一个不能取消的协程之中引用了上下文,由于协程可能被挂起,这一操作有可能导致内存泄漏,因此 anko
提供了 asReference
方法来获取当前上下文的弱引用,避免内存泄漏。
1 | private val ref: Ref<TestAnkoCoroutineActivity> = asReference() |
bg
用来快速的创建一个需要耗时的异步任务,并返回结果
1 | tv.setOnClickListener { |
SQLite
暂不研究