详解Kotlin和anko融合进行Android开发
作者:code_xzh 发布时间:2021-08-15 19:34:16
kotlin是一门基于jvm的编程语言,最近进行了关于kotlin和 anko的研究。并且结合现在的APP设计模式,设想了初步的开发方式。并且准备应用在新的项目中。
Kotlin和anko
Kotlin是大名鼎鼎的JB公司开发的jvm语言,官网地址为;http://kotlinlang.org/
官网的介绍为:
Statically typed programming language for the JVM, Android and the browser
Kotlin的设计思想非常的轻量,尽可能的去复用java代码,不到万不得已的时候,一般不会自己去实现一套大而全的库。这使得Kotlin非常的轻量,集成到Android的project并不会很明显的影响最终的打包大小。
关于Kotlin的优点,自己总结了几点:
1,和Java的无缝调用,这在初期不需要投入非常大的精力,即使遇到搞不定的坑,也不必担心影响业务开发的进度,直接换成java就好了。
2,大量的语法糖,使得代码非常的简洁,熟悉之后的开发效率也要高于Java。例如扩展函数,简单的封装再也不需要写一大堆Utils工具类,直接灵活的给某些类添加扩展方法就可以了。例如:
inline fun Activity.toast(message : Int) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
}
这样在Activity类中就多出了一个toast方法,实际上在anko中,也有大量已经写好的扩展方法,可以直接使用DSL语法去写UI。再例如when语句的写法:
when(x) {
1-> {}
2-> {}
}
很明显,相比传统的Java写法,使用anko后,语言更加简洁。
switch(x) {
case 1:
break;
case 2:
break;
default:
break;
}
3,更加安全,Kotlin似乎比较想消灭空引用,在Java中,调用一个null对象会抛出NullPointException,在Kotlin中,不能为空的对象,例如String对象,会写成:
var a: String? = "abc"
4,良好的生态环境和开发社区。Kotlin目前还是属于比较新的技术,很多人也都在尝试它的有点。包括Rx系列也出了RxKotlin,既RxJava的Kotlin版
Kotlin和Anko使用
Anko的github地址为https://github.com/Kotlin/anko。集成anko的步骤如下:
首先在project的build文件加入如下代码:
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" //这是需要你加入的
}
allprojects {
repositories {
jcenter()
maven {url 'https://dl.bintray.com/jetbrains/anko'} //这是你需要加入的
}
}
然后,在你app moudle的build文件里面添加依赖:
compile "org.jetbrains.anko:anko-sdk15:0.9.1" // So here it's 15 too
compile "org.jetbrains.anko:anko-appcompat-v7:0.9.1"
compile "org.jetbrains.anko:anko-design:0.9.1"
compile "org.jetbrains.anko:anko-recyclerview-v7:0.9.1"
根据kotlin的优势,选择使用anko进行编写,不使用xml进行编写。
这样的好处在anko的github README文件中是这样描述的:
不安全
没有空安全
迫使你为了每一个布局去写很多相似甚至重复的代码
XML在设备上浪费CPU时间和电量(应该是需要进行解析的原因) 不允许代码重用(没有完全理解,可能说的不是include标签而是自定义的layout)
至于Contract接口以及实体对象,可以直接使用Kotlin编写,第一为了语法简洁,第二不用写一大堆setter/getter方法。
具体的,首先编写MainActivity类,进行UI展示和事件等逻辑。
class MainActivity : AppCompatActivity(), MainContract.View {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
接下来在onCreate中编写ui布局,登录布局比较简单,就是2个输入框和一个按钮,当然为了试用多点的常见控件,我在最上方添加了Toolbar。
relativeLayout {
var mToolbar =
toolbar(R.style.Base_ThemeOverlay_AppCompat_Dark_ActionBar) {
id = ID_TOOLBAR
title = "登录"
backgroundColor = ContextCompat.getColor(this@MainActivity, R.color.colorPrimary)
popupTheme = R.style.Base_ThemeOverlay_AppCompat_Light
inflateMenu(R.menu.main)
setNavigationIcon(R.mipmap.img_back_white)
onMenuItemClick {
menuItem ->
val itemId = menuItem!!.itemId
when (itemId) {
R.id.menu_main -> {
toast(R.string.main_toast)
}
}
false
}
lparams {
width = matchParent
height = wrapContent
}
setNavigationOnClickListener {
finish()
}
}
var mUserEdit = editText {
id = ID_USER_EDIT
hint = "请输入同户名"
maxLines=1
lparams {
width = matchParent
height = wrapContent
margin=dip(8)
centerInParent()
}
}
var mPsdEdit = editText {
id= ID_PSD_EDIT
hint="请输入密码"
maxLines=1
maxWidth = 16
lparams {
width = matchParent
height = wrapContent
margin = dip(8)
below(ID_USER_EDIT)
}
}
var mButton = button("登录") {
id= ID_BTN_LOGIN
onClick {
var username = mUserEdit.text.toString()
var password = mPsdEdit.text.toString()
mPresenter!!.login(username,password)
}
lparams {
width= matchParent
height = wrapContent
margin = dip(8)
below(ID_PSD_EDIT)
}
}
}
代码中的id使用了常量,在Kotlin中没有static的概念,但是有一个companion object(伴随对象)可以模拟实现类似static的功能。
companion object static {
val ID_TOOLBAR: Int = 1
val ID_USER_EDIT: Int = 2
val ID_PSD_EDIT: Int = 3
val ID_BTN_LOGIN: Int = 4
}
可以看到,这样编写UI的代码非常的简洁。而且可读性非常的高。相信对XML写布局比较熟悉的同学都能看懂这里面代码的含义。同时官方还出了一个Android Stduio插件,叫做anko SDL preview。可以很方便的让开发者预览编写的效果。接下来按照MVP的思想, 编写BaseView和BasePresenter接口。
interface BaseView<T> {
fun setPresenter(presenter: T)
}
interface BasePresenter
使用Kotlin编写MainContract接口,这个接口建立起了V层和P层的通信。
interface MainContract {
interface View : BaseView<Presenter> {
fun login()
fun loginNUll()
}
interface Presenter : BasePresenter {
fun login(username: String, password: String)
}
}
使用Java编写P层代码。
public class MainPresenter implements MainContract.Presenter {
private MainContract.View mView;
public MainPresenter(MainContract.View view) {
mView = view;
mView.setPresenter(this);
}
@Override
public void login(String username, String password) {
if (TextUtils.isEmpty(username) || TextUtils.isEmpty(password)) {
mView.loginNUll();
return;
}
mView.login();
}
}
这里只是模拟了下登录的逻辑,并没有去真的实现一个登录
回到MainActivity,在这里加入我们的代码。
var mPresenter : MainContract.Presenter? = null
override fun setPresenter(presenter: MainContract.Presenter) {
mPresenter = presenter!!
}
实现V层应该实现的回调方法:
override fun loginNUll() {
toast("用户名密码不得为空")
}
override fun login() {
toast("执行登录逻辑...")
}
到这里,我们就完成了Kotlin和anko开发Android的实例,如果想要更加熟练的使用,还需要多加练习。
附:Anko的github地址为https://github.com/Kotlin/anko
来源:http://blog.csdn.net/xiangzhihong8/article/details/78488921
猜你喜欢
- 一. Base64编码由来为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASC
- 在IntelliJ IDEA中一不小心将你本地代码给覆盖了,这个时候,你 ctrl + z
- 一、消息中间件相关知识1、概述消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列
- 本文实例为大家分享了java实现微信红包的具体代码,供大家参考,具体内容如下要求基于BigDecimal类实现微信红包算法的功能,比如设置红
- 参考视频:https://www.bilibili.com/video/BV1Bq4y1Q7GZ?p=4通过视频的学习和自身的理解整理出的笔
- 本文实例为大家分享了java导出百万以上数据的excel文件,供大家参考,具体内容如下1.传统的导出方式会消耗大量的内存,2003每个she
- java8 Stream list to Map key 重复 value合并到Collectio关于把list转换成key value的m
- 本文实例为大家分享了Java实现抢红包功能的具体代码,供大家参考,具体内容如下关键思想:1.抢红包涉及多人并发操作,需要做好同步保证多线程运
- 本文实例为大家分享了Java使用MulticastSocket实现群聊应用程序的具体代码,供大家参考,具体内容如下在这篇文章中,讨论了一个使
- 最近有一个java实验,要求用java使用数据库,于是本人新手小白,在idea上卡了好半天希望看到这个博客的人能解决问题,跳过一些坑首先,我
- 前沿知识ThreadLocal存储线程变量,使用set方法设置变量,使用get方法获取变量线程隔离的实现是每个Thread类有一个类型为Th
- 1. 增强for概述增强for循环,也叫Foreach循环,用于数组和容器(集合类)的遍历。使用foreach循环遍历数组和集合元素时,无需
- IDEA安装后找不到.vmoptions文件在安装IDEA后在C盘的C:\Users\你的电脑用户名.IntelliJIdea2019.1\
- Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外
- 本文实例讲述了Java单例模式。分享给大家供大家参考,具体如下:在实际开发的时候会有一些需求,在某个类中只能允许同时存在一个对象。这时就需要
- 详解java中的PropertyChangeSupport与PropertyChangeListenerjava中的PropertyChan
- 本文实例讲述了Java泛型定义与用法。分享给大家供大家参考,具体如下:1. 泛型的由来先看如下代码:import java.util.Lis
- 之前文章介绍过了Fluent基本框架等,其中有几个重要的方法用到了IQuery和IUpdate对象。 这2个对象是FluentMybatis
- 本文介绍通过Java程序批量替换PDF中的指定文本内容。程序环境准备如下:程序使用环境如图,需要注意的是,本文使用了免费版的PDF jar工
- 实际开发中订单往往都包含着订单状态,用户每进行一次操作都要切换对应的状态,而每次切换判断当前的状态是必须的,就不可避免的引入一系列判断语句,