0.背景
哈哈,犯懒了,好久没写Kotlin的笔记了,最近听说Kotlin成了Android开发的官方语言了,我也凑个热闹。在上一篇Kotlin写Android(一)——开发环境搭建中已经详细讲述了Kotlin环境的搭建,及插件使用。但是在项目中还是远远不够的,接下来我会根据项目的实际开发对功能进行讲解,并从中总结kotlin的知识点。
1.Activity创建
我们这次做的是启动页,启动页肯定是用跳转功能的,对吧。那我们要有两个Activity,通过Kotlin写Android(一)——开发环境搭建的学习在我们的项目中已经存在了一个MainActivity,这个是从java转换过来的。我们还需要一个SplashActivity,这个我们直接创建:
这样就跟我们创建java文件一样,这里我们选择Kotlin Activity,先看下自动生成的代码:
class SplashActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
}
}
与我们之前转换得到的一样。
2.Activity跳转
下面就是如何实现SplashActivity与MainActivity之间的跳转了,实际上就是下面这个语句的转换:
startActivity(new Intent(this,MainActivity.class));
在具体下就是对象的创建和Class类型的表示。当初我是先建一个java类,把这段代码写在java代码中,再将java代码转换成kotlin,得到如下语句:
startActivity(Intent(this, MainActivity::class.java))
##3.数据库copy
项目中有个功能,就是拷贝raw中的数据库,java代码为:
private void copyDB() {
File dbFile = new File(getFilesDir(), "evaluation.db");
if (dbFile.exists() && dbFile.length() > 0) {
return;
}
try {
InputStream input = getResources().openRawResource(R.raw.evaluation);
OutputStream output = openFileOutput("evaluation.db", MODE_PRIVATE);
byte[] buffer = new byte[512];
int len;
while (true) {
len = input.read(buffer);
if (len == -1) {
break;
}
output.write(buffer, 0, len);
}
input.close();
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
转换后的kotlin代码为:
private fun copyDB() {
val dbFile = File(filesDir, "evaluation.db")
if (dbFile.exists() && dbFile.length() > 0) {
return
}
try {
val input = resources.openRawResource(R.raw.evaluation)
val output = openFileOutput("evaluation.db", Context.MODE_PRIVATE)
val buffer = ByteArray(512)
var len: Int
while (true) {
len = input.read(buffer)
if (len == -1) {
break
}
output.write(buffer, 0, len)
}
input.close()
output.close()
} catch (e: IOException) {
e.printStackTrace()
}
分析下两种语言的不同:
File的创建
java:
File dbFile = new File(getFilesDir(), "evaluation.db");
kotlin:
val dbFile = File(filesDir, "evaluation.db")
区别:
- 创建对象时,前面的类名声明没了,变成了val
- new关键字没有了(这个我们在上面的Intent创建中也可以看到)
- getFilesDir()变成了filesDir
而在InputStream的创建中我们发现与File的创建一样,只是getResources()变成了resources,在往下看,发现替换对象创建前面类名声明的不仅有val还有var,这两个又有什么区别?
先看下val与var的区别:
通过对var和val创建的对象对比我们不难发现,val创建的对象只有在创建时赋过一次值,之后没有在变化过,而var创建的对象被赋值了多次。val就相当于java中添加了final 关键字。
在看getResources()与resources
在kotlin里面我们按住ctrl键点到filesDir中查看,发现引用的就是getResources(),而所返回的mResources变量依旧是私有的。所以我们可以认为,当一个类中存在getXyz()的时候,我们通过kotlin可以直接用xyz来访问。
4.知识点总结
- 创建对象无需new关键字
- 创建对象无需在前面写类名,用var代替,final的用val代替
- 当对象中有类似getXyz()的方法时可以直接使用xyz来访问
- java的Class用类名::class.java表示(MainActivity.class->MainActivity::class.java)