详解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文件中是这样描述的:

  1. 不安全

  2. 没有空安全

  3. 迫使你为了每一个布局去写很多相似甚至重复的代码

  4. XML在设备上浪费CPU时间和电量(应该是需要进行解析的原因) 不允许代码重用(没有完全理解,可能说的不是include标签而是自定义的layout)

  5. 至于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

标签:kotlin,anko
0
投稿

猜你喜欢

  • 浅谈MyBatis 如何执行一条 SQL语句

    2023-10-17 19:36:03
  • 使用SpringBoot 工厂模式自动注入到Map

    2021-12-22 10:02:42
  • C#表达式树讲解

    2023-02-23 19:22:52
  • 教你用Java GUI实现文本文件的读写

    2023-05-25 06:47:13
  • Android中Splash应用启动白屏问题的解决方法

    2022-08-25 14:24:33
  • 注解处理器(APT)是什么

    2021-09-29 09:03:30
  • Android自定义控件案例汇总1(菜单、popupwindow、viewpager)

    2021-11-22 14:37:32
  • springboot常用注释的讲解

    2023-11-03 02:53:15
  • 详解Java的Spring框架下bean的自动装载方式

    2022-10-23 08:13:59
  • startJVM错误Unable to load native library: libjvm.so解决方法

    2023-03-24 08:54:29
  • 全面解析Java中的引用类型

    2022-07-15 23:48:07
  • docker 的java编译环境构建详细介绍

    2023-02-10 04:08:30
  • Java BigDecimal中divide方法案例详解

    2021-12-31 07:00:29
  • 详解在Spring Boot框架下使用WebSocket实现消息推送

    2023-03-08 01:32:05
  • C#实现ini文件读写操作

    2022-02-26 11:01:19
  • SpringBoot整合ElasticSearch实践

    2023-02-05 06:02:08
  • java中不定长参数的实例用法

    2021-06-17 02:49:35
  • swagger如何返回map字段注释

    2023-02-22 08:56:27
  • Spring Boot2中如何优雅地个性化定制Jackson实现示例

    2021-09-27 12:21:15
  • Javaweb中Request获取表单数据的四种方法详解

    2023-10-07 03:07:02
  • asp之家 软件编程 m.aspxhome.com