带你全方位使用Anko库-上篇

kotlin的伴生库-anko迭代了已经多个版本了,但是目前网上的资源主要集中在官方说明的机械翻译或者旧博客的复制/粘贴上。

本文带大家全方位的熟悉anko库的使用。anko库目前主要有四个核心库

  • anko-commons库,一些通用功能,集成方式:
dependencies {
//anko_version脚本配置,下同,本文中,该值为0.10.0
    compile "org.jetbrains.anko:anko-commons:$anko_version"
}
  • anko-layout库,牛逼的dsl(领域特定语言)功能,布局的另一种代码方式,相对比较简洁,xml的简易替代。集成方式:
dependencies {
    // Anko Layouts
    compile "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also available
    compile "org.jetbrains.anko:anko-appcompat-v7:$anko_version"

    // 主要为兼容一些控件事件的协程,不过协程coroutines目前还不是kotlin的正式内容
    compile "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"
    compile "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"
}
  • anko-coroutines库,集成方式:
dependencies {
    compile "org.jetbrains.anko:anko-coroutines:$anko_version"
}
  • anko-sqlite库,见名知义,简化sqlite使用的库,集成方式:
dependencies {
  compile "org.jetbrains.anko:anko-sqlite:$anko_version"
}

本篇主要介绍commons库和layout库的使用

这里先附上demo工程链接,喜欢的记得点个star哦。

  • 跳转activity并传递参数,这些参数是作为extra属性传递过去的,%Context/Fragment类扩展函数%
//启动
startActivity<IntentActivity>("name" to "小明", "age" to 12)
//IntentActivity接收参数
var name = intent.extras.getString("name")
var age = intent.extras.getInt("age")
//若有其它设置,则&intentFor方法&构建intent
startActivity(intentFor<IntentActivity>("name" to "小红", "age" to 13).singleTop())
  • 快捷 浏览器,发短信,分享,发邮件操作,%Context/Fragment类扩展函数%
 browse("http://m.baidu.com")
  • 增强log输出,目前发现的最大好处是支持list和map,整数,空,自定义数据类等类型的打印。缺点是1-名称略长,tag设置不太灵活,不过tag设置也无所谓,毕竟log查看/过滤完全可以不用tag。2-使用略麻烦,要么实现AnkoLogger 类,要么拿到AnkoLogger<SomeActivity>(this)变量,然后调用方法,不过完全可以写个方法封装,全局共用,具体demo有。
verbose("tag-默认为调用类")//貌似不会打印,原因暂时未知
debug(110)//貌似不会打印,原因暂时未知
 warn(null)
info(listOf<String>("today", "is", "a", "fine", "day"))
error(HashMap<String, String>().apply {
     put("小明", "12")
     put("小红", "13")
   })
 warn(CData("data", 100))
...

这里可结合一种优雅打log的方式,定制一份很强大的log方式,记得模板要声明kotlin的applicable,比如

error("$method$($file$:$line$)\r\n -"+$text1$)
  • Dimensions类,重要的方法主要是单位换算,%Context/Fragment/View类扩展函数%
dip(100)//dp->px
px2dip(100)//px->dp
  • Helper类,重要的方法主要有三个,挺实用的
//实用的attempt函数,{}若正常执行,则value返回{}的返回值,
//若{}执行有异常,并不会闪退,只是会设置个error属性。很好的try..catch替代方案
attempt { 3 }.value//结果3
attempt { 1 / 0 }.error
//还有sdk版本相关的
doFromSdk(21) {
      info("从api 21开始打印")
}
doIfSdk(21) {
      //获得版本名也简单的多
     packageManager.getPackageInfo(packageName, 0).versionName
     info("只有api 21才打印")
}
  • 对话框的优雅弹出,%Context/Fragment类扩展函数%
 alert("this is the msg") {
     customTitle {
        verticalLayout {//用到了anko-layout库
        imageView(R.mipmap.ic_launcher)//方便的设置内容
        editText { hint = "hint_title" }
        }
     }
     okButton { toast("button-ok") }
     cancelButton { toast("button-cancel") }
  }.show()
  • 列表selector的优雅实现,%Context/Fragment类扩展函数%
val countries = listOf("Russia", "USA", "England", "Australia")
 selector("Where are you from?", countries) { ds, i ->
          toast("So you're living in ${countries[i]}, right?")
  }

--其它的一些常用属性,代码能简洁不少,%Context/Fragment类扩展函数,有的是AnkoContext的类扩展属性%

displayMetrics,defaultSharedPreferences,act
assets,ctx,contentView,resources//基本见名知义吧,不介绍了
bundleOf("name" to "test")//just show bundle,return Bundle对象
toast(".."'),progressDialog()..//使用很简单

以上,commons库的使用介绍完毕,应该是比较全了。

下面介绍layout库,网上有关这个的库的介绍比较多,主要是dsl比较cool比较潮吧,不过目前这个对简答的布局比较适用,复杂的还真不好说。权当语法糖熟悉下。这里尽量只列代码和使用,还有一些网上少见的用法。

  • 先上个常规的用法,需要注意的点是find<Button>(BTN_ID),可以在dsl外部获得指定view
 verticalLayout {
      padding = dip(30)
       editText {
       hint = "Name"
      textSize = 24f
      }
       editText {
       hint = "Password"
        textSize = 24f
      }
      button("Login") {
         textSize = 26f
          id = BTN_ID
      }
 }
//note
 //id findview
find<Button>(BTN_ID).setOnClickListener { toast("this is login button") }
  • 布局不该放到activity中吧,否则那样太乱了,所以第二种方案来了:
//声明一个类继承AnkoComponent,对应泛型类到一个LayShowActivity,然后布局
class LayoutActyUI : AnkoComponent<LayShowActivity> {
    val ET_ID = 0x1001
    override fun createView(ui: AnkoContext<LayShowActivity>) = with(ui) {
        verticalLayout {
            val name = editText("LayoutActyUI") {
                id = ET_ID
            }
            button("Say Hello") {
                onClick {
                    ctx.toast("Hello, ${name.text}!")
                    name.textColor = 0xffff0000.toInt()
                }
            }
        }
    }
}
//然后在LayShowActivity调用下面的方法即可实现加载布局
LayoutActyUI().setContentView(this)

  • 引入布局参数和一些多函数控件事件监听器的简洁使用,具体解释见注释
verticalLayout {
            button("seekbar") {
                textSize = 26f
            }.lparams(width = wrapContent) {//布局参数
                horizontalMargin = dip(15)
                topMargin = dip(20)
            }
             editText {
                hintResource = R.string.app_name//直接引用资源文件内容的方式
                textChangedListener {多函数事件简单写法
                    onTextChanged { str, start, before, count ->
                        ai(str)
                    }
                }
            }
   }

这里补充下函数控件事件监听器,比如:

//原java方式用法,必须传入TextWatcher对象作为参数,而且有些函数根本用不上,比较麻烦。
EditText(act).addTextChangedListener(object :TextWatcher{
            override fun afterTextChanged(s: Editable?) {
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
            }

        })
//现在只需利用anko库的这个写法,使代码大大减少且清晰
 EditText(act).textChangedListener {
            onTextChanged { str, start, before, count ->
                ai(str)//log..info
   }
}
onClick{},onCheckedChange{},onDateChange{}
onDrawerOpen{},onItemClick{},onScrollChange{}等等都有类似用法

好了,本篇就介绍到这,下篇会对另两个子库做个比较全面的介绍。

附上demo工程链接,喜欢的记得点个star哦。

作者刘咸尚

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,570评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,368评论 6 343
  • 1. 经过某个咖啡厅,经过某个石板凳,你都会情不自禁地想着,有没有机会能够遇见他呢? 当你把他落下的东西寄回去给他...
    佳人有梦阅读 1,038评论 0 0