Android快速开发之Anko魔法(上篇)

众所周知,目前 kotlin 已经作为 Google 官方推荐的 Android 开发语言,目前 GitHub 上面关于 kotlin 的项目已然呈现一片势不可挡的热度。作为一名 Android 开发者,学好 koltin 已经成为我们必须 get 的技能,而想要在工作中使用 kotlin 快速开发项目,Anko 无疑成为首选利器!

​ 那么 Anko 到底是什么呢?可以为我们做哪些事情呢?

​ Anko 是一款 kotlin 的扩展库,可以帮助我们更加简单、快速的开发 Android 应用。它能够让我们的代码更加洁净易读,并且忘记 Java 那种繁琐、复杂的编程方式。Anko 库主要分为以下几个部分:

  • Anko Commons(通用扩展库):一个轻量级的帮助库,可以让我们使用少量代码就可以轻松、快速使用 IntentDialogLogToastSnackBar 等常用功能。
  • Anko Layouts(布局扩展库):一种快速、类型安全的方式去通过代码动态编写 Android 布局,有点类似 swift 中的方式。
  • Anko SQLite(SQLite扩展库):一个针对Android的SQLite查询DSL和解析器的集合。
  • Anko Coroutines(kotlin协程扩展库):基于 kotlinx.coroutines 库的扩展

由于一篇文章篇幅较长,故分为上下两部分来讲解,上篇主要介绍Anko Commons扩展库的相关功能。

Anko Commons

该库主要包含一些常见功能的扩展和封装,常见的有 dialogsintenttoastsnackBar 等,下面我们先来看看具体如何使用它们。首先需要依赖一下扩展包:

// Anko Commons
implementation "org.jetbrains.anko:anko-commons:0.10.8"

Toasts

Toast(吐司)算是我们最常用的功能,大家项目中或多或少都对其进行了一层封装,anko 中使用也很方便,只需要这样:

toast("login success!")
toast(R.string.login_success)
longToast("Wow, nice work!")

SnackBars

SnackBar 是Android5.0后 material design 中常用控件之一,它的出现和 Toast 差不多,为了给用户带来一些提示性信息,具体特点可以自行查阅相关文章。通过 Anko 我们只需要通过以下方式就可以直接体会到它的魅力:

view.snackbar("login success!")
view.snackbar(R.string.login_success)
view.longSnackbar("Wow, nice work!")
view.snackbar("Action, reaction", "Click me!") { doSomeThing() }

Dialogs

Dialog 是我们最常用的功能之一,它较为醒目,层级较高,其中最常用的当属 AlertDialog 了,通常我们这样使用:

AlertDialog.Builder(this)
        .setPositiveButton(R.string.btn_allow_text) { _, _ -> request.proceed() }
        .setNegativeButton(R.string.btn_deny_text) { _, _ -> request.cancel() }
        .setCancelable(false)
        .setTitle("提示")
        .setMessage("我们需要请求使用您手机的部分权限,是否同意?")
        .show()

虽然是链式调用,但使用较多时依旧很麻烦,通过 Anko,我们可以直接通过下面代码来实现相同功能:

alert("我们需要请求使用您手机的部分权限,是否同意?", "提示"){
    yesButton {
        request.proceed() 
    }

    noButton {
        request.cancel()
    }
}.show()

比较下来,是不是很方便,节省了一多半的代码量。

当然,很多时候我们需要使用 AppCompat 下的 AlertDialog ,因为它提供了向下兼容的特性,保证在不同Android系统上尽量达到相同效果,这时我们需要依赖针对 AppCompat 的扩展包:

// Appcompat-v7 (only Anko Commons)
implementation "org.jetbrains.anko:anko-appcompat-v7-commons:0.10.8"

然后我就可以直接这样使用 AppCompat 下的 AlertDialog 了:

alert(Appcompat, "我们需要请求使用您手机的部分权限,是否同意?", "提示"){
    yesButton {
        request.proceed() 
    }

    noButton {
        request.cancel()
    }
}.show()

如果我们想自定义弹窗的布局呢?别着急,Anko 同样为我们提供方式实现:

alert {
    customView {
        editText()
    }
}.show()

什么?这就完了?没错,如果你想在弹窗里放一个输入框,这样就实现了。你肯定会好奇,怎么设置layout呢?先别急,这是anko为我们提供的另外一个强大功能,这块将在后面说到,先卖卖关子😁。

你可能又会突然想起来,AlertDialog 还为我们提供了列表单选功能呢,哈哈,anko 同样为我们考虑到了,我们只需要这样写:

alert(Appcompat, "Please select your country where you come from", "Tips"){
            yesButton {
                
            }

            noButton {

            }

            val countries = listOf("Russia", "USA", "Japan", "Australia")
            selector("Where are you from?", countries) { _, i ->
                toast("So you're living in ${countries[i]}, right?")
            }
        }.show()

怎么样,是不是也很方便?只需要在alert域中通过 selector 实现就可以了。

另外,Anko 同样为我们提供了快速使用 ProgressDialog 方式,例如:

val dialog = progressDialog(message = "Please wait…", title = "Tips")

Intent

开发过 Android 都知道,Intent 是我们构建页面时必不可少的工具,它是四大组件通信的"信使"。一般地,我们在项目中这样使用:

val intent = Intent(this, SomeOtherActivity::class.java)
intent.putExtra("id", 5)
intent.setFlag(Intent.FLAG_ACTIVITY_SINGLE_TOP)
startActivity(intent)

而我们通过 Anko 就完全可以通过一行代码实现:

startActivity(intentFor<SomeOtherActivity>("id" to 5).singleTop())

怎么样,是不是超级方便?而且它给我们提供的链式调用,很清晰,此外,它还为我们提供了 Intent 常用功能,例如拨打电话、发邮件、分享等等:

Goal Solution
Make a call makeCall(number) without tel:
Send a text sendSMS(number, [text]) without sms:
Browse the web browse(url)
Share some text share(text, [subject])
Send a email email(email, [subject], [text])

Log

Log 日志功能我们平时应该说用的最多了,通常用来打印一些关键信息,测试一些关键逻辑正确性。Anko 为我们提供了自己的扩展封装,使用起来很方便:

class SomeActivity : Activity(), AnkoLogger {
    private fun someMethod() {
        info("London is the capital of Great Britain")
        debug(5) // .toString() method will be executed
        warn(null) // "null" will be printed
    }
}

或者不想通过实现接口方式,可以借助以下方式:

class SomeActivity : Activity() {
    private val log = AnkoLogger(this.javaClass)
    private val logWithASpecificTag = AnkoLogger("my_tag")

    private fun someMethod() {
        log.warning("Big brother is watching you!")
    }
}

对应的日志打印方法如下:

android.util.Log AnkoLogger
v() verbose()
d() debug()
i() info()
w() warn()
e() error()
wtf() wtf()

其他特殊扩展功能

  1. Colors

    Anko为我们提供了两种针对色彩的扩展功能来让我们的代码更佳易读,如:

    Function Result
    0xff0000.opaque 不透明的红色
    0x99.gray.opaque 不透明的#999999(灰色)
  2. Dimensions

    你可以指定 dimension 的 dip (density-independent pixels) 或 sp (scale-independent pixels)值: dip(dipValue)sp(spValue). 注意 textSize属性默认接受sp (textSize = 16f). 使用 px2dippx2sp 相互转换.

  3. applyRecursively

    applyRecursively 方法将lambda表达式应用于传递 View 的本身,如果它是 ViewGroup ,则递归到它的每个字节点,例如这样:

    verticalLayout {
        editText {
            hint = "Name"
        }
        editText {
            hint = "Password"
        }
        button("login now") {
            onClick { toast("login success!") }
        }
    }.applyRecursively { view -> when(view) {
        is EditText -> view.textSize = 20f
        is Button   -> view.text = "点我呀~"
    }}
    

Anko Commons 基础扩展库已经介绍的差不多了,怎么样?看完 Anko 施加在 Android 上的“魔法”,是不是迫不及待地想去大展身手了?原来代码还可以这样简洁明了,方便易用。哈哈,Android快速开发之Anko魔法(下篇)也将在不久于大家不见不散😄。

QQ交流群:601924443 欢迎Android或者kotlin爱好者加入探讨交流。

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

推荐阅读更多精彩内容