1.Android项目集成Kotlin

当我们的IDE安装好Kotlin插件(“Kotlin”)以后,项目想集成Kotlin将是一件非常轻松的事情,我们只需要在菜单栏中选择“Tools”->"Kotlin"->"Configure Kotin in Project"即可。

2. Kotlin-android-extensions插件减少模板代码

用java进行Android界面开发时,最多的模板代码findviewbyid(),于是我们项目中引入了ButterKnife进行编译时注解。到了Kotlin的时候,我们需要写的代码量就更少了,我们这样做:

在app/build.gradle中加入kotlin-android-extensions插件

apply plugin: 'kotlin-android-extensions'

于是我们就可以这样开发:

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/btn_center" //我才是重点

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true" />

class VideoActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_video)

btn_center.setOnClickListener{ // 我才是重点

toast("be Clicked!")

}

}

}

我们不用再写findviewbyid了!!!

不用像butterknife那样

@bindview(R.id.btn_center)

Button centerBtn

对于控件我们只需要根据xml定义的ID直接使用!

3.通过Anko加快界面渲染效率

3.2 AnKo的集成

3.3 布局文件的两种方式的编写(添加AnKo layout的依赖库)

java中我们可以使用xml进行代码的编写,直观简洁,但是效率不高,因为系统会进行xml解析生成对应的控件。当然,我们也可以直接用代码进行编写,效率是提高了,但阅读行和复杂性提高了。而Anko采用了一种这种的办法,定义DSL语法,用代码编写“xml”。

模式一:

class WebActivity : AppCompatActivity() {

private lateinit var webview: WebView

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

verticalLayout { // 重点在这里

button("open Link") {

setOnClickListener {

getPagebyUrl("http://www.baidu.com")

}

}

webview = webView().lparams(matchParent, matchParent) //同时将创建的控件全局化

}

}

fun getPagebyUrl(url: String) { // 此处后面会重点讲解优化

Thread {

val Page = URL(url).readText()

runOnUiThread {

webview.loadData(Page, "text/html", "utf-8")

}

}.start()

}

}

擦!!这么简洁的布局写在这个类里面还好,但是实际项目开发中,布局就可能比较复杂了,一个xml动不动就上百来行,全写着这个里面,类不就很臃肿了么?

小伙子(小妹妹)如果有这想法,证明思维还是蛮成熟,AnKo也考虑到这一点,支持Activity与layout分离,我们可以这样:

模式二:

class MainActivityUI : AnkoComponent {

companion object { // 这里定义了控件的ID,方面在Activity中根据ID找控件

val req_btn = 1

val showview = 2

}

override fun createView(ui: AnkoContext) = with(ui) {

verticalLayout {

button("请求数据") {

id = req_btn

}.lparams(width = matchParent, height = wrapContent)

textView {

id = showview

}.lparams(matchParent, matchParent)

}

}

}

集成AnkoComponent 接口,在createView()方法中编写DSL语法,创建布局。

接下来我们看看Activity怎么写的?

class MainActivity : AppCompatActivity() {

private lateinit var contentView: TextView

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

MainActivityUI().setContentView(this) //将上面的布局设置给该Activity

val reqBtn = find(MainActivityUI.req_btn) // 根据ID寻找控件

contentView = find(MainActivityUI.showview)

reqBtn.setOnClickListener {

getPagebyUrl(“http://www.baidu.com”)

}

}

fun getPagebyUrl(url: String) { // 此处后面会重点讲解优化

Thread {

val Page = URL(url).readText()

runOnUiThread {

contentView.text = Page

}

}.start()

}

}

}

3.4 anko layout中添加自定义控件

上面的 MainActivityUI 中添加的都是系统自带的控件,实际开发过程中,单纯使用系统组件是远远不够的,于是我们开始了自定义控件。那么问题来了,自定义的控件如何添加到DSL的layout中,直接使用显然是不能够的! 不用担心,我们先看一下anko是如何让button支持DSL语法的(老规矩,点击刚刚编写的button查看源码)

inline fun ViewManager.button(text: CharSequence?): android.widget.Button {

return ankoView(`$$Anko$Factories$Sdk25View`.BUTTON, theme = 0) {

setText(text)

}

}

OMG,原来只是在ViewManager中添加一个拓展方法,通过ViewManager.ankoView()生成View对象,并初始化值(知道真相的我们,眼泪掉下来!) , 嘿嘿!接下来我们也效仿的来一套!

编写自定义控件,CircleView

创建一个View.kt文件

添加如下代码

inline fun ViewManager.circleView(init: com.yl.testcenter.CircleView.() -> Unit) = ankoView({ CircleView(it) }, theme = 0) { init() }

ps: 其中ViewManager.circleView这个扩展方法名是在layout中控件使用的名称

控件的装逼使用

verticalLayout {

id = container

button("请求数据") {

id = req_btn

}.lparams(width = matchParent, height = wrapContent)

textView {

id = showview

}.lparams(matchParent, wrapContent)

circleView { // ---- 我在这!!

backgroundColor = Color.RED

}

}

3.5 异步数据请求,更新UI(添加Kotlin coroutines依赖库)

上面异步请求网络数据的方式:

fun getPagebyUrl(url: String) {

Thread {

val Page = URL(url).readText()

runOnUiThread {

contentView.text = Page

}

}.start()

上面通过异步线程切换UI线程更新控件,显然代码变现上很直接了,但如果用协程就更加明了:

fun getInfo() {

var job = async(CommonPool,start = CoroutineStart.LAZY) { //协程任务一

getVideoInfo()

}

launch(UI){ //协程任务二

contentView.text = job.await()

}

}

说明:

创建一个后台协程任务,不开启(start = CoroutineStart.LAZY声明此协程不自定开启,需要手动调用await才启动)

创建一个UI协程任务,默认为开启(没有设置start=xxx)

UI协程更新控件,根据后台协程的返回值,协程不会阻塞UI线程。

与上面相比没有线程切换的嵌套!

Android kotlin ui框架,Kotlin之UI篇相关推荐

  1. UI框架Funky Tunes UI Kit

    介绍: UI框架Funky Tunes UI Kit 网盘下载地址: http://kekewangLuo.net/daj4tvCaSk60 图片:

  2. oracle 前端ui框架,Layui(前端UI框架) 2.6.4 官方最新版

    Layui最好用的前端ui框架是一款带着浓烈情怀的国产前端UI框架,她追求极简,又不失丰盈的内在,说她是史上最轻量的结晶,似乎并不为过.一切都源自于她对原生态的执着,对前端社区的那些噪杂声音的过滤,以 ...

  3. wpf ui框架_RapidCAX 开源UI框架

    微信公众号:AnyCAD专注打造新一代图形平台,助每一个工业软件成功! RapidCAX UI框架 从零开始搭建CAD/CAE/CAM的UI框架是一件繁琐的事情:需要选组件.集成组件以及各种配置.若集 ...

  4. 简单的UI框架 | 一、UI界面的搭建

    简单的UI框架 UI界面的搭建 文章目录 简单的UI框架 前言 一.UI资源的导入 二.游戏主界面设置 1.背景设置 2.游戏主玩法图标按钮 3.游戏主玩法界面 4.预制体 总结 前言 本文将会学习到 ...

  5. vue ui框架_vue前端UI框架,一点都不圆润,盘它!

    面对众多vue前端UI框架,看着它们干干巴巴.麻麻赖赖的样子,一点都不圆润,跟我一起盘它! Vue移动端UI框架 1.Vux(star:15620) VUX(读音 [v'ju:z],同 views)是 ...

  6. 推荐一个前端ui框架:SuperUI ui开发框架

    源码名称:SuperUI ui开发框架 下载地址:http://www.chtml.cn/topic/show/7102 适用范围:所有网站前后台开发 基于框架:bootstarp 基于bootsta ...

  7. vue3使用的移动端UI框架,vue3.0 ui组件库

    vue 3.0 项目中 element-ui form 表单元素中 仅 el-button 显示,其他不显示,如何解决? 谷歌人工智能写作项目:小发猫 在页面中引用了laydate插件,在显示的时候, ...

  8. 一起Talk Android吧(第三百八十二回:UI框架)

    文章目录 使用背景 概念介绍 命令式UI框架 声明式UI框架 各位看官们,大家好,上一回中咱们说的是通知发送方式的的例子,这一回中咱们介绍的例子是UI框架.闲话休提,言归正转,让我们一起Talk An ...

  9. 【Vue学习总结】21.Vue-UI框架之Mint UI的使用

    接上篇<20.Vue路由中的嵌套> 上一篇我们讲解了Vue路由中的嵌套,本篇我们来介绍Vue的UI框架----Mint UI的使用. 本系列博文使用的Vue版本:2.6.11 一.基于Vu ...

最新文章

  1. 那么都数据库表,那么多不同记录。是怎样都存储在一个key-value数据库的?
  2. python 数学符号读法大全_math_数字与数学 | Numeric Mathematical_Python_参考手册_非常教程...
  3. 数据绑定以及Container.DataItem几种方式与用法分析 收藏
  4. officeopenxml excelpackage 需要安装excel嘛_使用ABAP操作Excel的几种方法
  5. java 判断范围_java判断一个点是否在一个围栏范围内
  6. C语言实现简单的单例模式
  7. Eset易视Smart灵巧护卫Security
  8. 魅族开售跳票,创饥饿营销新高度?
  9. 压缩包文件密码忘记了文件怎么办?
  10. python生成exe文件
  11. grab显示服务器报错,grab链接不到服务器怎么解决
  12. python小白入门第二课-标识符数据类型字符串方法
  13. 安卓机 input file图片上传无反应解决方案
  14. Linux系统简介(简单粗暴)
  15. ncut算法分割图像的matlab,Ncut_9 归一化切割和图像分割算法及其论文, 不仅度量了不同分组之间总体不相似性, matlab 269万源代码下载- www.pudn.com...
  16. 1对多 只取一条 mysql_MySQL 多表关联一对多查询实现取最新一条数据的方法示例...
  17. 野三坡游记 探访岭南台村
  18. Unity中的多光源
  19. 项目经理之如何做好项目经理
  20. python使用while、for及循环嵌套实现直角三角形及正、倒金字塔

热门文章

  1. 【Y忍冬草】枚举作为返回类型
  2. 流程梳理有什么价值?如何建立高效的流程管理体系?
  3. 读取导入csv csv报错iterable expected, not float
  4. Unity-shader学习笔记(七)
  5. 【Dakota】02 GUI无法新建Model File(.bmf)
  6. C# 机器视觉工控通讯------西门子PLC之S7协议上位机通讯
  7. 小球沿不同轨迹运动时水平方向速度的比较
  8. 【自考学习】自学考试,我们在成长
  9. 微波、超短波、短波、中波、长波的频率(波长)
  10. 无监督关键短语的生成问题01--综述