android kotlin anko怎么用
发布网友
发布时间:2022-04-22 08:13
我来回答
共1个回答
热心网友
时间:2022-06-18 10:54
在项目中配置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 indivial mole 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,未尝不是一种提高效率,开发速度提高了很多,并且简洁很多了