在继续之前,首先我们祭出Kotlin 在android上的大杀器:
apply plugin: 'kotlin-android-extensions'
这个插件,将这句话添加到app的build.gradle上
这是一个Kotlin官方提供的一个可以帮助我们在代码区获取控件并处理的工具。
什么意思呢?
比如说我的xml中有一个控件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/kt_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello kotlin"/>
</LinearLayout>
有一个textview控件,id名为kt_text
在以前,我们要使用这个控件,需要怎么做呢
TextView tvKt;
tvKt = (TextView)findViewById(R.id.kt_text);
tvKt.setText("");
......
对吧,很标准的使用方法,或者使用依赖注入,直接Bind之类之类的
那么在kotlin中,如果我们使用了这个插件,我们可以直接。
kt_text.setText("厉害了")
是的,直接就可以用了
package com.stanny.kotlintest
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
kt_text.text = "厉害了"
}
}
我们可以直接打出kt_text,
可以得到如下的提示框,选中后,会自动import一个类
import kotlinx.android.synthetic.main.activity_main.*
然后你可以直接拿着这个kt_text进行各种操作了。
是不会想说什么鬼?
说实话,在我开始学习kotlin的是否,遇到这个,让我对kotlin一下子充满了强烈的好奇与期待。
接下来我们再来看一个例子
打印Toast,我们新建一个Button按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<Button
android:id="@+id/btn_kt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="hello kotlin"/>
</LinearLayout>
这次我们设置他的点击事件
同样,我们先写出之前的设置方法
Button btn;
btn = (Button)findViewById(R.id.btn_kt);
btn.setOnClickListener(new OnClickListener(){
@overwrite
public void onClick(View view){
showToast("toast");
}
});
public void showToast(String toastInfo){
Toast.makeText(this, toastInfo, Toast.LENGTH_SHORT).show();
}
非常眼熟的代码吧。可是却是很多
来看看kotlin 的代码
btn_kt.setOnClickListener { showToast("可以说炒鸡厉害了") }
fun Context.showToast(toastInfo: String, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, toastInfo, duration).show()
}
!!!!!!!!!!!!!
先不说下面的showToast这个方法,只看上面的设置点击事件的代码。
是不是简直不可思议?
六七行的代码,一行搞定。
接下来看下面的代码
showToast这个方法,前面有一个Context,是指,该方法可以使用在Context类型的方法中。
后面有两个参数 toastInfo 和duration
和java不同的是,kotlin的代码,参数名放在类型之前
比如说String toastInfo变成了toastInfo : String。
其二,
duration: Int = Toast.LENGTH_SHORT
这句代码,我们不管定义了duration这个int类型的变量,还给她赋值了
这是为什么呢?
另外,我们在调用这个方法的时候
showToast("可以说炒鸡厉害了")
也只传了一个参数进来,这又是为什么呢?
是的!默认!这个Toast.LENGTH_SHORT是一个默认参数。
不传就默认使用这个参数。
也就是说,其实我们也可以传,像这样
showToast("可以说炒鸡厉害了", Toast.LENGTH_LONG)
在以前的话,很明显我们得写两个方法名相同参数不同的方法才行。
这种又方便了我们方法的重载。
上面,只是大概的给大家一点甜头,感受了一下kotlin的方便,避免大家逃跑。。。
后面,我们来研究一下一些死板无聊的东西
一、数据类型
首先给大家盗一张图,这个是数值类型
我也找不到出处了,十分抱歉
可以看出,和原jiava的数据类型十分的相似,大的不同比如首字母都大写
变量的声明:
var <参数名> : <类型> = <默认值>
比如:
var pageNum : Int = 10
var pageName : String = "123"
var pageSize : Double = 1.20
常量的声明:
val <参数名> : <类型> = <默认值>
比如:
val name : String = "xb"
val age : Int = "23"
val sex : String = "男"
可以看出,相比于java的final static int 这里的常量声明简单了很多
当然,首先你得熟悉参数名居然在参数类型之前这一颠覆你世界观的设定
除此之外,声明还可以像下面这种
val name = "xb"
val age = 18
因为,我们的默认值已经确定了是数值还是字符串
所以就不需要再写数据类型,即age已经默认了是整数类型
另外,之前在java中一些风骚操作也不能使用了,比如
String size = 18 + "cm";
就不能写作
val size: String = 18 + "cm"
这样是会报错的,kotlin是强类型检测,不允许这种
另外,定义变量,还会用到一个符号
?问号
比如
var a : Int = 1
var b : Int? = 1
在上面这种情况下,两种方式是一样的
?表示该类型可以为null,即可以把?当做@nullable来使用
即可以给b赋值 b = null
如图所示,给a赋值为null,会直接报错
在这里我们也可以看出kotlin是空指针安全的,在原来java里,我们需要去手动添加判断
if(a ! null){
......
}
判断成功后才继续走下一步,使用了kotlin后,我们甚至在编写代码的是否就可以判断是否会出错了。
然后是数组类型 Array
var array1 = arrayOf(1, 2, 3)
var array2 = arrayOfNulls<Int>(5)
var array3 = arrayListOf<String>()
上面就是三种最简单的Array类型
array1相当于java的带参数数组
int[] array1 = new int[]{1,2,3}
array2相当于java的不带参数数组
int array2 = new int[5]{}
array3相当于java的集合list
List<String> array3 = new ArrayList<>();
除了这种基础用法,我们还可以使用带函数的方式
比如
var array4 = Array(3, { i -> i + 5 })
解读:创建一个长度为3,每个参数的值+5的一个array
array4的值就是{5,6,7}
除了基本Array,array也有它的衍生类
ByteArray
IntArray
ShortArray
DoubleArray
LongArray
FloatArray
CharArray
BooleanArray
但是!就是没有StringArray,因为Array的基本款就是StringArray
var array5: IntArray = intArrayOf(1, 2, 3)
var array6: BooleanArray = booleanArrayOf(true, false, true)
多行字符串
字符串我们上面说过
var name = "xbb"
var name : String = "xbb"
这是单行字符串
kotlin中还可以使用多行字符串
var mLine = """
I like Kotlin
It's very Nice
Hello World
"""
乍得一看,有人说啦,其实咧,这就是java的换行+号了
String a = "I like Kotlin"+
" It's very Nice"+
"Hello World";
Too Young Too Simple
这是两个完全不一样的东西
因为kotlin是支持这样的
var m = "I like Kotlin"+
"It's very Nice"+
"Hello World"
那么这个三个引号包裹起来是什么意思呢
我们直接打印来看
var m1 = """
I like Kotlin
It's very Nice
Hello World
"""
var m2 = "I like Kotlin" +
"It's very Nice" +
"Hello World"
println(m1)
println(m2)
对,多行字符串是带了换行功能的,他不仅仅是一个拼装的效果
下一章我们研究一for if 之类的方法
Android开发,Kotlin的了解与学习(三)-----流程控制语句