内容来自学习郭霖《第一行代码(第三版)》
关于findViewById()
Java中如果不用第三方开源库,例如ButterKnife,则需要对布局文件中所需要用到的控件在Java代码中使用findViewById方法来绑定获取控件的实例。而Kotlin中则不用,直接在activity中使用这个控件的ID就可以了。这是因为使用Kotlin编写Android项目在app/build.gradle文件的头部默人引用了apply plugin: 'kotlin-android-extensions'
插件,这个插件会自动根据布局文件中定义的控件ID自动生成一个具有相同名称的变量。因此我门可以直接在activity中使用这个变量,而不用再次去调用findViewById方法了,其实apply plugin: 'kotlin-android-extensions'
插件背后也是通过findViewById()方法来实现的。
启动Activity的最佳写法
在实际项目开发过程中经常会出现对接的情况。比如SecondActivity并不是你开发的,但现在你负责开发的部分需要启动SecondActivity,而你却不清楚启动SecondActivity需要传递哪些参数。这是无非就有两个方法:一个是你自己去阅读Second Activity中的代码,另外一个是询问编写SecondActivity的同事。你会不会觉得很麻烦呢?其实只需要换一种写法,就可以轻松解决上面的窘境,代码如下:
class SecondActivity : BaseActivity() {
companion object{
fun actionStart(context: Context,data1:String,data2:String){
val intent=Intent(context,SecondActivity::class.java)
intent.putExtra("param1",data1)
intent.putExtra("param2",data2)
context.startActivity(intent)
}
}
}
可以用apply标准函数简化,写法如下:
class SecondActivity : BaseActivity() {
companion object{
fun actionStart(context: Context,data1:String,data2:String){
val intent=Intent(context,SecondActivity::class.java).apply{
putExtra("param1",data1)
putExtra("param2",data2)
}
context.startActivity(intent)
}
}
}
在启动SecondActivity的地方
SecondActivity.actionStart(this,"data1","data2")
定义静态方法
在Java中定义一个静态方法非常简单,只需要在方法上声明一个static关键字就可以了,如下所示:
public static Util{
public static void doAction(){
System.out.println("do action")
}
}
这是一个简单的工具类,上述代码doAction就是一个静态方法,调用静态方法不需要创建类的实例,直接Util.doAction(),适合编写一些工具类的功能。
而Kotlin中推荐使用单例类的方法来实现静态方法同样的功能,具体实现如下:
object Util{
fun doAction{
println("do action")
}
}
使用时,也是直接Util.doAction(),而不用创建类的实例。
不过这样,存在一定的问题,就是只要是Util类里面的方法都将变成类似这种静态方法的调用方式,如果只希望Util类中的某一个方法变成这种调用方式呢?答案如下:
class Util{
fun doAction1(){
println("do action1")
}
companion object{
fun doAction2(){
println("do action2")
}
}
}
上述Util类中doAction1是普通类,调用它需要先创建Util类的实例,而doAction2则可以用Util.doAction2()直接调用。
Kotlin中真正静态方法的写法
上述Kotlin静态方法的实现都不是真正意义上的静态方法,而是通过单例的方式来达到同样的效果,而kotlin真正意义上的实现静态方法如下:
使用@JvmStatic注解
class Util {
fun doAction1(){
println("do action1")
}
companion object{
@JvmStatic
fun doAction2(){
println("do action2")
}
}
}
注意:@JvmStatic注解只能加在单例类或companion object中的方法上,还有Kotlin中所有的顶层方法都是静态方法
Kotlin标准函数
普通写法
val list= listOf("Apple","Banana","Orange","Pear","Grape","Watermelon")
val builder=StringBuilder()
builder.append("Start eating fruit.\n")
for (fruit in list){
builder.append(fruit).append("\n")
}
builder.append(("Eat all fruits"))
val result=builder.toString()
println(result)
用with写法
val list= listOf("Apple","Banana","Orange","Pear","Grape","Watermelon")
val result= with(StringBuilder()){
append("Start eating fruits.\n")
for (fruit in list){
append(fruit).append("\n")
}
append("Eat all fruits.")
toString()
}
println(result)
用run写法
val list= listOf("Apple","Banana","Orange","Pear","Grape","Watermelon")
val result=StringBuilder().run {
append("Start eating fruits.\n")
for (fruit in list){
append(fruit).append("\n")
}
append("Eat all fruits.")
toString()
}
println(result)
用apply写法
val list= listOf("Apple","Banana","Orange","Pear","Grape","Watermelon")
val result=StringBuilder().apply {
append("Start eating fruits.\n")
for (fruit in list){
append(fruit).append("\n")
}
append("Eat all fruits.")
}
println(result.toString())