当前位置:   article > 正文

Android Studio开发简易记事本(kotlin语言)_kotlin记事本

kotlin记事本
  1. 系统架构设计
  • 前端采用安卓开发的框架,使用kotlin语言来进行开发。
  • 后端使用本地数据库(如SQLite)来存储记事条目的相关信息。
  • 界面设计采用安卓的布局和控件来实现用户交互和界面展示。
  1. 功能模块划分

基本任务模块:实现记事标题、记事内容和记事时间的添加功能。

进阶任务模块:实现记事条目的编辑、修改和删除功能。

高级任务模块:实现图片、声音或者视频的添加、删除功能。

  1. 界面设计

首页:用来展示所有已经编辑保存完成的便签的列表并自动生成,如果没有便签会显示无便签,提供添加按钮用于新建创建记事条目。同时提供一键清空按钮。如图2.1所示:

图2.1 首页

编辑页面:跳转到新的页面,用来编辑记事条目的标题、内容、时间、图片、语音和视频。如图2.2所示:

图2.2 编辑页面

  1. 数据存储

基本任务:使用SQLite数据库来存储记事条目的标题、内容和时间。

进阶任务:在基本任务的基础上,增加一个id用于标识记事条目的状态(如编辑、删除等)。

高级任务:在进阶任务的基础上,增加添加图片、语音和视频的URI列,用来存储与记事条目相关的图片、声音或视频文件。如图2.3所示:

图2.3 数据库代码

  1. 用户交互

基本任务:通过点击添加按钮,跳转到添加页面,用户可以输入标题、内容,并点击保存按钮将记事条目添加到数据库中。并根据保存的时间自动添加时间戳到数据库中。

进阶任务:在主页面中,用户可以长按已有的便签,弹出对话框供用户选择删除还是编辑,点击修改,跳转到修改页面,对记事条目的标题、内容和时间进行修改,并点击保存按钮更新数据库中的对应条目。点击删除时,会将便签从页面中移除并把数据库中对应数据删除。同时,还提供一键清空已有便签的按钮。如图2.4所示:

图2.4 修改/删除

高级任务:在添加页面,授权成功后用户可以选择是否添加图片、声音或视频文件。当添加进来时不想要了可以长按删除,并且添加的语音可以点击播放,包括视频可以选择进度暂停,点击保存时会把相应数据保存到数据库中。

  1. 异常处理和安全性考虑

在用户输入过程中,需要对输入的内容进行非空判断,标题和内容至少添加一项,避免保存到空便签的情况。

在进行文件操作时,需要考虑文件读写权限和文件存储的安全性问题,确保用户的文件不会丢失或泄露。

  1. 部分代码

主页面:

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

        }

    }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/832095
推荐阅读
相关标签
  

闽ICP备14008679号