您的位置:首页 > 移动开发 > Android开发

Kotlin+Anko 你应该尝试的新Android开发方式

2016-12-28 18:27 429 查看
老早之前就听说过Kotlin语言,奈何不成熟,也没什么机会用到它,只是用它写过demo而已,最近楼主因为单独一个人负责一个项目,因为项目难度不大,所以就打算用一下Kotlin来开发,因为Kotlin与Java是完美替换的,所以如果出问题不熟也可以马上切换为Java,所以风险不会很大,还有在公司用新技术,最好是请示你们的老大,因为楼主是独立开发且是外包,所以就自己做注意了,好了,不说废话。

初尝Kotlin+Anko,我发现Kotlin写起来很舒服,首先在我们的项目中配置Kotlin和Anko环境,在项目的build.gradle中

buildscript {
ext.kotlin_version = '1.0.4'
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}


在模块的build.gradle中

apply plugin: 'kotlin-android'

compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
compile 'org.jetbrains.anko:anko-sdk15:0.9' // sdk19, sdk21, sdk23 are also available
compile 'org.jetbrains.anko:anko-support-v4:0.9' // In case you need support-v4 bindings
compile 'org.jetbrains.anko:anko-appcompat-v7:0.9' // For appcompat-v7 bindings
compile 'org.jetbrains.anko:anko-recyclerview-v7:0.9' // For appcompat-v7 bindings
compile 'org.jetbrains.anko:anko-design:0.9'


就这样我们配置好了Kotlin和Anko的环境了,接下来我们就能使用了:

变量

在java中我们声明一个变量时,需要先声明类型再声明变量,而Kotlin不用,而是跟js一样统一用var来修饰变量,用var修饰的变量值是可变的,如果你想声明一个不可变的变量即常量,可以用val关键字来形容,例如:

var a = "string"
val b = "final"


注意,因为Kotlin是空安全的,如果变量有可能是null,我们需要先用?显示声明变量可以为null,然后在别的地方使用时要用变量+!!来引用,即

var a : Int ?= null

a!!.toString()


方法

Kotlin中方法的声明统一用关键字fun来形容,例如:

fun A(a:Int){}//带参 无返回值
fun A(){}//不带参 无返回值
fun A(a:Int) : Int{return a}//带参 有返回值


Kotlin中方法的返回值是相当于定义变量一样用:类型。

data class

数据类是我觉得最简单方便的,在java中我们定义一个数据类bean时要写成这样:

class A{
private String a;
//set方法
//get方法
}


就是这种一大堆,而Kotlin中数据类直接这样写:

data class A(val x: Double, val y: Double)


是不是很方便,这种写法是Kotlin初始化的方法一种形式,还有一种不是写在首行而是写在init{}块中,Kotlin允许有多个初始化方法,但是其它都是副初始化方法,最后都会指向主初始化方法。

Kotlin还有很大新特性,具体的可以去官网查看demo,我这里只是大概列出一些普通的特性,

Anko是一个新的布局框架,我们在Android开发中布局都是写在xml文件中,每次都要写一大堆布局代码,而且不能复用,所以Android的布局一般都是很麻烦会花费很多时间,并且Android本身解析xml文件也需要时间,而Anko不会,Anko使用的是DSL,领域相关语言,开销很小,所以可以提高我们APP的绘制效率以及性能。

下面用Anko布局一个登陆界面,有用户名框,密码框,密码

relativeLayout {
editText {
id = PHONENUMBER_ID
}.lparams (width = matchParent,height = wrapContent){
centerHorizontally()
}

editText {
id = PASSWORD_ID
inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
filters = myFilters
}.lparams(width = matchParent,height = wrapContent) {
below(PHONENUMBER_ID)
}

button(ctx.getString(R.string.btn_login)){
id = LOGIN_ID
}.lparams (width = wrapContent,height = wrapContent) {
below(PASSWORD_ID)
centerHorizontally()
}
}


这样就是我们的布局了,简洁很多,并且复用,我们控件的布局是写在lparams中,Anko的扩展性也很强,就是我们自定义的控件也能放在Anko中使用例如:

inline fun ViewManager.myRecyclerView(theme: Int = 0) = myRecyclerView(theme) {}
inline fun ViewManager.myRecyclerView(theme: Int = 0, init: MyRecyclerView.() -> Unit) = ankoView({ MyRecyclerView(it) }, theme, init)


在这里我们自定义了一个控件叫MyRecyclerView,我们新建一个.kt文件,然后输入上面的代码,我们就可以在app中使用这个控件了

val myRecyclerView = myRecyclerView {
layoutManager = LinearLayoutManager(ctx, LinearLayoutManager.VERTICAL, false)

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

myRecyclerView.setEmptyView(textView ("我是空数据的时候显示") {})

myRecyclerView.setEmptyViewListener{
v->
Log.i("TAG","OOOOOOOO空数据")
}


这就是Anko的扩展性,而且扩展性还很强,我们可以用两个控件直接扩展成一个控件:

fun _LinearLayout.smsCode(name: String): EditText {
var a : EditText? = null
linearLayout {
orientation = LinearLayout.HORIZONTAL

textView("$name:") {
textSize = 18f
}.lparams(width = dip(50)
,height = dip(50)) {
}

a = editText().lparams (width = dip(50)
,height = dip(50)){
}
}
return a!!

}


这样就是把两个控件简单的合成一个,适用于一些控件布局是一样且经常用的,这样就可以直接当成一个控件来使用。

Anko和Kotlin还有更多好玩的特性,我觉得使用这种方式来开发Android,未尝不是一种提高效率,就楼主自己使用来说,感觉开发速度提高了很多,并且简洁很多了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Kotlin Anko