Kotlin学习之旅第十二天
今天主要是Koltin编写代码,进行功能实现
前言
Kotlin学习之旅(D6)-Kotlin Idioms part 1
Kotlin学习之旅(D7)-Kotlin Idioms part 2
Kotlin学习之旅(D8)-From Java to Kotlin
Kotlin学习之旅(D9)-Android Extensions
Kotlin学习之旅(D10)- Unit Test with Kotlin
新建项目
开发环境:
- MacOS Mojave Version 10.14
- Android Studio 3.2
创建NoteKeeper
- 打开Android Studio -> New Project -> 输入项目名称NoteKeeper
- 到Add an Activity to Mobile 的时候,选择
Basic Activity
- 别忘了勾上
include kotlin support
- 完成项目创建
管理实体类
我们要记录笔记,那么首先就需要有一个实体类用于记录课程,还有一个实体类用于记录笔记信息,这个时候我们可以创建一个 数据管理类 来统一管理这些实体类
创建NoteKeeperData
在Java文件夹下的com.blue.notekeeper文件夹(你们的应该是各自的项目名称) 右键,new -> kotlin file
创建一个名为NoteKeeperData
的Kotlin File
注意:在新建文件的时候,下面有个kind选项,我们选择的是File 而不是Class
此时我们的需求是:
- 课程有id,有title
- 笔记有title,text,还需要课程的信息
所以在NoteKeeperData里面编写代码:
1 | /** |
CourseInfo
和 NoteInfo
都是Data Class,然后重写toString()方法,返回我们需要的信息和指定的格式
知识点:Data Class , 字符串模板,构造函数,默认参数,空安全
数据管理类
有个实体管理类,我们就可以开始加入模拟数据了
首先创建一个Kotlin Class -> DataManager
定义存储数据类型
我们使用HashMap来存储课程(CourseInfo),使用ArrayList来存储笔记(NoteInfo),因此定义两个val
1 | val courses = HashMap<String, CourseInfo>() // use courseId to find CourseInfo class |
加入模拟的课程数据
我们通过courses.set() 方法加入数据
这里有好几种方式,还记得我们的CourseInfo类吗
1 | class CourseInfo (val courseId: String, val title: String) |
我们实例化一个CourseInfo对象的时候,需要传入courseId
和 title
两个参数,但是传参也有好几种方式
不指定参数名,指定参数名,指定参数名但是不按顺序 都是没问题的,可以看代码注释
1 | var course = CourseInfo("android_intent", "使用Intent进行Activity跳转") |
加入模拟的笔记数据
1 | var course = courses["android_intent"]!! |
DataManager完整代码
1 | package com.blue.notekeeper |
数据展示页-NoteListActivity
在完成了所需要的实体类和模拟数据之后,我们终于可以进入到界面的编写阶段了,首先创建NoteListActivity
我们通过这种方式来创建:
然后选择 Empty Activity
就可以了,Android Studio会自动帮我们生成
- 继承自CompatActivity的NoteListActivity文件
- activity_note_list.xml文件
OK,让我们进入activity_note_list.xml,把代码改成:
activity_note_list.xml
1 |
|
然后再创建一个名为: content_note_list
的xml文件,代码为:
content_note_list.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
然后,编写NoteListActivity
的代码
1 | class NoteListActivity : AppCompatActivity() { |
最后,修改我们的AndroidMainfest.xml文件,让NoteListActivity成为启动项
1 | <activity |
一切就绪,此时运行App,看到的效果应该是这样的:
只有一个ListView用于展示模拟数据,FAB和Item都没有点击效果,接下来我们要往里面加入其它功能了。
新建笔记
修改NoteListActivity
在NoteListActivity
加入FAB和Item的点击事件,跳转到MainActivity
在onCreate
方法加上:
1 | fab.setOnClickListener { view -> |
创建名为Constants
的Kotlin File
NOTE_POSITIONI
和 POSITION_NOT_SET
是无关界面的常量,因此我们需要创建一个文件来保存,这样可以方便管理,代码的结构也会比较清晰。
加入以下代码:
1 | const val NOTE_POSITIONI = "NOTE_POSITIONI" |
到目前为止,数据列表页的工作就完成了,接下来就是跳转后的编辑页面的工作
修改MainActivity
我们现在回到MainActivity,把MainActivity当成是新建和编辑笔记的页面。首先修改布局文件activity_main.xml
1 |
|
然后修改content_main
1 | <?xml version="1.0" encoding="utf-8"?> |
由于布局不是我们的重点,所以在这里编写和调整的过程就先忽略,大家只要能看懂大概是什么意思就可以了
OK,回到MainActivity
我们需要处理几个事情:
- 判断进来的是新笔记还是旧笔记
- 新笔记不用处理
- 旧笔记需要把数据放到对应的位置
代码如下:
1 |
|
我们除了处理新建/编辑笔记两种情况,还做了一点特殊处理
- 通过onPause()保存数据
- 通过onSaveInstanceState()保存状态
OK,这个时候再运行一下App,效果应该是:
- 进入App通过列表形式展示模拟数据
- 点击FAB进入一个新的页面,填入数据后返回,在列表页可以看到新增笔记
- 点击列表中的任意一项,进入编辑页面,笔记数据在对应位置展示出来
总结
其实到这里我们就已经完成了大部分的功能了,明天我们主要的任务就是在ActionBar上加入一个Next按钮,可以查看下一条笔记,这个功能有利于提高用户体验,这种交互也是Android官方所提倡的,通过按钮或者手势来进行交互。
Day 12 - Learn Kotlin Trip, Completed.