Kotlin学习之旅第十三天
今天主要是编写代码,继续实现其他的功能
前言
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
今日目标
首先要说的就是,昨天我们已经完成了App基本的添加,编辑功能了,但是有一个很不方便的地方,就是App来查看笔记的时候没有办法直接查看下一条,因此今天我们要做的就是,在ActionBar加入一个Next按钮,点击按钮之后能显示下一条笔记的信息。
点击笔记 -> 显示笔记内容 -> 点击右上角的 ‘’>’’ -> 显示下一条笔记
这种交互方式对用户来说更为友好,顺便我们也能学习一下ActionBar的用法~走你
修改MenuItem
首先我们来看一下res -> menu 文件夹下的 menu_main.xml
文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context="com.blue.notekeeper.MainActivity">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="@string/action_settings"
app:showAsAction="never" />
</menu>
这个时候只有一个item,我们加入Next Item
<item
android:id="@+id/action_next"
android:checkable="true"
android:enabled="true"
android:icon="@drawable/ic_forward_white_24dp"
android:title="Next"
android:visible="true"
app:showAsAction="ifRoom|withText" />
创建icon
的方式和前面创建其他图标是一样的
- drawable文件夹右键 -> new -> Vector Asset
- 在
Clip Art
选项中选择forward
- 把颜色设置为白色
也可以看图片:
注意:app:showAsAction=“ifRoom|withText” 的意思就是 当屏幕空间足够的时候,这个item会显示到ActionBar 具体效果大家可以运行项目,然后 切换屏幕方向 就懂了
- 横屏的时候Next的图标和文字都会显示出来
- 竖屏的时候Next只有图标显示出来,文字由于空间不足就隐藏起来了
修改MainActivity
xml文件搞定以后,我们就要开始在代码中处理逻辑了
Menu提供了两个方法给我们处理menu item的相关逻辑
- onPrepareOptionsMenu() - 这个方法很常见,在item被点击的时候会触发,因此我们在这里做对应的点击事件的处理
- onPrepareOptionsMenu() - 这个方法可能用的比较少,在item还未初始化之前会被调用,因此我们可以在这里做一些准备工作,例如对item图标的更换,点击事件的控制等,接下来大家就知道为什么要重新这个方法了
重写onPrepareOptionsMenu()
override fun onOptionsItemSelected(item: MenuItem): Boolean {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
return when (item.itemId) {
R.id.action_settings -> true
R.id.action_next -> {
moveNext()
true
}
else -> super.onOptionsItemSelected(item)
}
}
知识点:when 表达式
moveNext()
private fun moveNext() {
++notePosition
displayNote()
invalidateOptionsMenu()
}
每一次点击 next
按钮,我们先让记录当前笔记位置的变量notePosition
+1,然后再显示下一条笔记,这个方法已经在昨天的文章里实现了,最后就是调用invalidateOptionsMenu()
方法。
重写onPrepareOptionsMenu()
在没有重写这个方法之前,如果我们不停的点击next,到了最后一条笔记的时候,再点击next,app会crash,原因就是数组下标越界了。这个问题很容易解决,就是当我们已经显示了最后一条笔记时,next按钮变成一个不可点击的状态,如图:
在onPrepareOptionsMenu()方法里面,我们通过当前的位置来进行判断是否需要变更图标
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
if (notePosition>= DataManager.notes.lastIndex){
val menuItem = menu?.findItem(R.id.action_next)
if (menuItem != null){
menuItem.icon = getDrawable(R.drawable.ic_block_white_24dp)
menuItem.isEnabled = false
}
}
return super.onPrepareOptionsMenu(menu)
}
如果还没到最后一条笔记,那么就显示next,否则的话就显示block
,并且设置为不可点击。
关于如何生成 block icon,这里就不重复了,步骤和上面生成Next图标是一样的
最后再运行一遍App,看一下效果,应该就和Day11那篇文章开头的动图是一样的了。
总结
在这个笔记App中,我们实现了以下功能:
- 新增笔记
- 查看和编辑笔记
- 通过Next查看下一条笔记
- 横竖屏切换时保存笔记状态
但是其实还有许多可以改进的地方,例如:
- 删除笔记(List 左滑 / 长按 / 进入编辑页面删除 等等)
- 优化控件(RecyclerView 替换 ListView)
- 优化界面(让笔记通过卡片形式展示,加入点击和过场动画,使用不同颜色的字体 等等)
- 优化笔记功能(可以插入图片,url,等额外的信息)
有兴趣的童鞋可以在此基础上继续开发~通过实战提高自己的技术!!
不过我们Kotlin学习之旅的目的还是达到了,虽然只是一个简单的半成品App,通过前期学习Kotlin的语法和特性,然后到一步步写出这个App,这个过程中的成就感还是非常大的,同时也让自己对Android和Kotlin得以一直保持热度和兴趣。
明天就是Kotlin学习之旅的最后一天了,我会做一个Kotlin学习资料的总结,包括文档,博客,视频,Github的开源项目等
Day 13 - Learn Kotlin Trip, Completed.