Kotlin 开发Android (四):提升Android开发
2017-04-04 本文已影响238人
dasan沈扬
1.去掉findViewById
只需要在App Module的build.gradle 中添加
apply plugin: 'kotlin-android-extensions'//手动添加
代码然后就可以这样写
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
//直接使用activity_kotlin.xml中的id
test.setOnClickListener { view-> onClickTest(view) }
}
inflate生成的View,也可以直接操作xml中id
fun onClickTest(view: View):String?{
var view:View = LayoutInflater.from(this).inflate(R.layout.dialog_kotlin,null, false);
val text:String = "clicked this is dialog!";
message = text;
view.message.setText(message);
var dialog: AlertDialog = AlertDialog.Builder(this).setView(view).setPositiveButton("this", DialogInterface.OnClickListener { dialog, which -> onClickDialog(dialog, which, text)}).create();
dialog.show();
return null;
}
2.空安全
i. 变量或参数可空用 ?标记
不可空类型如果设置为空会提示错误
屏幕快照 2017-04-04 下午4.15.29.png
ii.安全调用
调用可空参数时未加?会提示不安全,?表示非空就返回后面的内容,为空就返回null
屏幕快照 2017-04-04 下午4.23.52.png
iii. ?: 表达式
表达式左边为非空,为空时‘执行’表达式右边,如右边包含return ,throw Exception等也可以
var object1: StaticInnerClass? = null;
var length3: String = object1?.getNewName() ?: throw RuntimeException("test");
iiii. !! 非空强制转换符
屏幕快照 2017-04-04 下午4.49.47.png3.函数扩展
//扩展Context类,增加toast方法
fun Context.toast(message: String, time: Int) {
Toast.makeText(this, message, time).show();
}
fun onClickTest(view: View):String?{
var context: Context = this;
context.toast("toast text",Toast.LENGTH_SHORT);//调用扩展方法
return null;
}
在外部扩展,供整个项目使用。新建Kotlin文件,内容如下
package com.ifnoif.androidtestdemo.kotlin
import android.content.Context
import android.widget.Toast
/**
* Created by shen on 17/4/4.
*/
fun Context.toast(message: String, time: Int) {
Toast.makeText(this, message, time).show();
}
4.数据类(data class,巨幅 减少代码)
data class会自动根据构造函数实现equals()/hashCode,toString,还会增加copy方法
data class Car(var name:String,var color:String, var weight:Int){
}
fun testCar(){
var car:Car = Car("bus","red",1000);
var color = car.color;
var name = car.name;
var weight = car.weight;
var newCar:Car =car.copy(name="bicycle",weight = 10);
var equalsResult =car.equals(newCar);
}
5. lambda 表达式,减少匿名内部类
看看setOnClickListener怎么写的
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_kotlin)
test.setOnClickListener { view-> onClickTest(view) }
}
更多Lambda用法参考:函数式编程之Lambda表达式
6.Anko 库,可以让您编写描述性的布局,而无需使用XML
如在activity中显示一个垂直布局
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) {
verticalLayout {
val name = editText()
button("Say Hello") {
onClick { toast("Hello, ${name.text}!") }
}
}
}
}
需要配置插件
dependencies {
compile 'org.jetbrains.anko:anko-sdk15:0.7.1' // sdk19, sdk21, sdk23 are also available
compile 'org.jetbrains.anko:anko-support-v4:0.7.1' // In case you need support.v4 bindings
}
更多Anko相关:https://github.com/Kotlin/anko
7.其他特性
Smart Casts(智能类型转换)
if (obj is String) {
//判断通过后就能使用该类型的API
print(obj.length)
}
//安全的类型转换,类型不匹配则x为null
var y: Any = 123
val x: String? = y as? String
println("x:"+x+" y:"+y)//输出x:123 y:null
String Templates(字符串模板)
//更容易阅读
val s = "abc"
val str = "$s.length is ${s.length}" // 结果"abc.length is 3"
代理
//接口中包含具体的方法,类似java8中Default 方法
interface Operation {
fun add(a: Int, b: Int): Int;
fun print(){
println("Operation")
}
}
Range expressions(范围表达式)
for (i in 1..4) print(i) // prints "1234"
for (i in 4..1) print(i) // prints nothing
for (i in 4 downTo 1) print(i) // prints "4321"
for (i in 1..4 step 2) print(i) // prints "13"
for (i in 4 downTo 1 step 2) print(i) // prints "42"
具体方法重写成抽象方法
open class Base {
open fun f() {}
}
abstract class Derived : Base() {
override abstract fun f()
}
class SubDerived:Derived() {
override fun f() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
8.不支持的
异常检查
抛出异常后不会让你强制捕获异常。kotlin也支持在方法上抛出异常@Throws(Exception::class)
如果java调用该方法需要强制处理
//kotlin调用java中有异常的方法
var fileOutputStream:FileOutputStream = FileOutputStream("/out.txt")
var byteArr:ByteArray = ByteArray(1024)
fileOutputStream.write(byteArr)
//kotlin定义一个会抛出异常的方法
companion object {
@Throws(Exception::class)
fun testGson() {companion object {
@Throws(Exception::class)
fun testGson() {
}
}
//java中调用kotlin中方法
public void testInvokeKotlin() {
try {
GsonTest.Companion.testGson();
} catch (Exception e) {
e.printStackTrace();
}
}
更多与java比较
https://kotlinlang.org/docs/reference/comparison-to-java.html