赞
踩
基本任务模块:实现记事标题、记事内容和记事时间的添加功能。
进阶任务模块:实现记事条目的编辑、修改和删除功能。
高级任务模块:实现图片、声音或者视频的添加、删除功能。
首页:用来展示所有已经编辑保存完成的便签的列表并自动生成,如果没有便签会显示无便签,提供添加按钮用于新建创建记事条目。同时提供一键清空按钮。如图2.1所示:
图2.1 首页
编辑页面:跳转到新的页面,用来编辑记事条目的标题、内容、时间、图片、语音和视频。如图2.2所示:
图2.2 编辑页面
基本任务:使用SQLite数据库来存储记事条目的标题、内容和时间。
进阶任务:在基本任务的基础上,增加一个id用于标识记事条目的状态(如编辑、删除等)。
高级任务:在进阶任务的基础上,增加添加图片、语音和视频的URI列,用来存储与记事条目相关的图片、声音或视频文件。如图2.3所示:
图2.3 数据库代码
基本任务:通过点击添加按钮,跳转到添加页面,用户可以输入标题、内容,并点击保存按钮将记事条目添加到数据库中。并根据保存的时间自动添加时间戳到数据库中。
进阶任务:在主页面中,用户可以长按已有的便签,弹出对话框供用户选择删除还是编辑,点击修改,跳转到修改页面,对记事条目的标题、内容和时间进行修改,并点击保存按钮更新数据库中的对应条目。点击删除时,会将便签从页面中移除并把数据库中对应数据删除。同时,还提供一键清空已有便签的按钮。如图2.4所示:
图2.4 修改/删除
高级任务:在添加页面,授权成功后用户可以选择是否添加图片、声音或视频文件。当添加进来时不想要了可以长按删除,并且添加的语音可以点击播放,包括视频可以选择进度暂停,点击保存时会把相应数据保存到数据库中。
在用户输入过程中,需要对输入的内容进行非空判断,标题和内容至少添加一项,避免保存到空便签的情况。
在进行文件操作时,需要考虑文件读写权限和文件存储的安全性问题,确保用户的文件不会丢失或泄露。
主页面:
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == EDIT_REQUEST_CODE && resultCode == Activity.RESULT_OK && data != null) {
val noteId = data.getIntExtra("noteId", -1) // 获取传递回来的 noteId 值
val title = data.getStringExtra("title") ?: ""
val content = data.getStringExtra("content") ?: ""
val time = data.getLongExtra("time", System.currentTimeMillis())
if (noteId != -1) { // 如果有传递 noteId,说明需要更新指定便签的内容
val noteLayout = noteContainer.findViewById<LinearLayout>(noteId)
if (noteLayout != null) {
val titleTextView = noteLayout.getChildAt(0) as TextView // 假设标题是第一个子视图
val contentContainer = noteLayout.getChildAt(1) as LinearLayout
val timeTextView =
contentContainer.getChildAt(0) as TextView // 时间是 contentContainer 的第一个子视图
val contentTextView =
contentContainer.getChildAt(1) as TextView // 内容是 contentContainer 的第二个子视图
titleTextView.text = title
timeTextView.text = formatTime(time)
contentTextView.text = content
}
} else { // 否则,需要创建一个新的便签
// 创建新的便签
createNewNoteLayout(title, content, formatTime(time))
}
}
}
添加页面:
private fun saveNote() {
val db = dbHelper.writableDatabase
val title = titleEditText.text.toString().trim()
val content = contentEditText.text.toString().trim()
val currentTime = System.currentTimeMillis()
val simpleDateFormat = SimpleDateFormat("MM月dd日 HH:mm", Locale.getDefault())
val formattedTime = simpleDateFormat.format(Date(currentTime))
if (title.isEmpty() && content.isEmpty()) {
Toast.makeText(this, "请填写标题和内容", Toast.LENGTH_SHORT).show()
} else {
val values = ContentValues().apply {
put("title", title)
put("content", content)
put("time", currentTime)
// 保存图片、语音和视频的Uri到数据库
for (i in imageUris.indices) {
put("image_uri_$i", imageUris[i]?.toString())
}
if (audioUri != null) {
put("audio_uri", audioUri?.toString())
}
if (videoUri != null) {
put("video_uri", videoUri?.toString())
}
}
if (noteId == -1) { // 没有传递ID参数,执行插入操作
db.insert("Note", null, values)
} else { // 传递了ID参数,执行更新操作
if (videoUriToDelete != null) {
val db = dbHelper.writableDatabase
val values = ContentValues().apply {
put("video_uri", null as String?) // 将视频链接设置为null
}
db.update(
"Note",
values,
"id=? and video_uri=?",
arrayOf(noteId.toString(), videoUriToDelete.toString())
)
}
// 处理需要删除的语音链接
for (audioUri in audioUrisToDelete) {
val selection = "id=? and audio_uri=?"
val selectionArgs = arrayOf(noteId.toString(), audioUri.toString())
val values = ContentValues().apply {
put("audio_uri", null as String?) // 将音频链接设置为null
}
db.update("Note", values, selection, selectionArgs)
}
for (i in 0 until 3) { // 遍历所有的图片链接列
val column = "image_uri_$i"
val selection = "id=? and $column=?"
for (imageUri in imageUrisToDelete) {
val selectionArgs = arrayOf(noteId.toString(), imageUri.toString())
values.put(column, "") // 或者设置为null:values.putNull(column)
db.update("Note", values, selection, selectionArgs)
}
}
db.update("Note", values, "id=?", arrayOf(noteId.toString()))
}
db.close()
Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show()
// 清空待删除图片列表
imageUrisToDelete.clear()
val intent = Intent()
intent.putExtra("title", title)
intent.putExtra("content", content)
intent.putExtra("time", formattedTime)
intent.putExtra("noteId", noteId) // 添加 noteId 参数
// 将图片、语音和视频的URI作为额外的数据放入意图中
intent.putStringArrayListExtra("imageUris", ArrayList(imageUris.map{ it?.toString() }))
intent.putExtra("audioUri", audioUri?.toString())
intent.putExtra("videoUri", videoUri?.toString())
setResult(Activity.RESULT_OK, intent)
finish()
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。