Kotlin写Android(二)——启动页(java转kotlin)

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")

区别:

  1. 创建对象时,前面的类名声明没了,变成了val
  2. new关键字没有了(这个我们在上面的Intent创建中也可以看到)
  3. 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.知识点总结

  1. 创建对象无需new关键字
  2. 创建对象无需在前面写类名,用var代替,final的用val代替
  3. 当对象中有类似getXyz()的方法时可以直接使用xyz来访问
  4. java的Class用类名::class.java表示(MainActivity.class->MainActivity::class.java)
发布了37 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/github_34790294/article/details/52179265