Android记事本定时功能,Android如何实现记事本功能

Android如何实现记事本功能

发布时间:2020-07-22 13:55:53

来源:亿速云

阅读:91

作者:小猪

这篇文章主要讲解了Android如何实现记事本功能,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。

该记事本包含创建新条目,数据库增删改查,条目可编辑,滑动删除与拖拽排序,简单闹钟实现(还有个简陋背景音乐开关就不提了太简单),接下来逐一介绍一下。

build.gradle导入

apply plugin: 'kotlin-kapt'

'''

implementation 'com.google.android.material:material:1.0.0'

implementation 'de.hdodenhof:circleimageview:3.0.1'

implementation 'com.android.support.constraint:constraint-layout:1.1.3'

implementation 'androidx.room:room-runtime:2.1.0'

implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'

implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.2.0'

implementation 'androidx.recyclerview:recyclerview:1.0.0'

kapt "androidx.room:room-compiler:2.1.0"

没什么多说的。

Room数据库

room数据库相比于sqlite来说对新人确实友好很多,在没有SQL基础的前提下,增删改查等实现都很简单,只需创建一个实例,便可在线程中进行。具体代码为

①接口:

@Dao

interface NoteDao {

@Update

fun updateNote(newNote: Note)

@Query("select * from Note")

fun loadAllNotes(): List

@Query("select * from Note where title > :title")

fun loadNotesLongerThan(title:String) : List

@Query("select * from Note where id == :id")

fun loadById(id:Long) :Note

@Delete

fun deleteNote(note: Note)

@Query("delete from Note where title == :title")

fun deleteNoteByTitle(title: String): Int

@Insert

fun insertNote(note: Note)

}

②Appdatabase类(获取实例

@Database(version = 1, entities = [Note::class])

abstract class AppDatabase: RoomDatabase(){

abstract fun noteDao() : NoteDao

companion object{

//访问实例

private var instance : AppDatabase? = null

@Synchronized//同步化

fun getDatabase(context: Context):AppDatabase{

instance?.let {

return it

}

return Room.databaseBuilder(context.applicationContext,

AppDatabase::class.java, "app_database")

.build().apply {

instance = this

}

}

}

}

滑动删除和拖拽排序

class RecycleItemTouchHelper(private val helperCallback: ItemTouchHelperCallback) :

ItemTouchHelper.Callback() {

//设置滑动类型标记

override fun getMovementFlags(

recyclerView: RecyclerView,

viewHolder: RecyclerView.ViewHolder

): Int {

return makeMovementFlags(ItemTouchHelper.UP or ItemTouchHelper.DOWN,

ItemTouchHelper.END or ItemTouchHelper.START )

}

override fun isLongPressDragEnabled(): Boolean {

return true

}

//滑动

override fun isItemViewSwipeEnabled(): Boolean {

return true

}

//拖拽回调

override fun onMove(

recyclerView: RecyclerView,

viewHolder: RecyclerView.ViewHolder,

target: RecyclerView.ViewHolder

): Boolean {

helperCallback.onMove(viewHolder.adapterPosition, target.adapterPosition)

return true

}

//滑动

override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int): Unit {

helperCallback.onItemDelete(viewHolder.adapterPosition)

}

//状态回调

override fun onSelectedChanged(

viewHolder: RecyclerView.ViewHolder?,

actionState: Int

) {

super.onSelectedChanged(viewHolder, actionState)

}

interface ItemTouchHelperCallback {

fun onItemDelete(positon: Int)

fun onMove(fromPosition: Int, toPosition: Int)

}

}

NoteAdapter接口实现

拖拽排序和滑动删除后即更新一次,这种方法并不好,毕竟没有用到MVVM中的高级组件,包括观察者,Livedata,ViewModel察觉数据变化并提示更新。建议在这种方法的前提下可以考虑在从Activity离开后,再数据更新。

注:千万不要在**onPause()**中涉及数据更新和保存!!!

//拖拽排序

override fun onMove(fromPosition: Int, toPosition: Int) {

val noteDao = AppDatabase.getDatabase(context).noteDao()

if (fromPosition < toPosition) {

for (i in fromPosition until toPosition) {

Collections.swap(noteList, i, i + 1)

for (i in noteList){

Log.d("title", i.title)

}

Log.d("tag2", fromPosition.toString()+"->"+toPosition)

}

} else {

for (i in fromPosition downTo toPosition + 1) {

Collections.swap(noteList, i, i - 1)

}

}

//排序后的数据更新

thread {

var templist = noteDao.loadAllNotes().toMutableList()

for (i in 0 until templist.size){

templist[i].title = noteList[i].title

templist[i].content = noteList[i].content

noteDao.updateNote(templist[i])

}

}

notifyItemMoved(fromPosition, toPosition)

}

简易闹钟实现

broadcast类需要自己实现

class MyReceiver : BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent) {

// This method is called when the BroadcastReceiver is receiving an Intent broadcast.

Toast.makeText(context,"You have a task to do!!!", Toast.LENGTH_LONG).show()

}

}

这里只是发个广播通知,并没有提示声音,可以采取发到通知栏的方式,系统会有提示音。涉及到AlarmManager类

NoteActivity中的实现:

setBtn.setOnClickListener { view ->

val c = Calendar.getInstance()

//调整为中国时区,不然有8小时差比较麻烦

val tz = TimeZone.getTimeZone("Asia/Shanghai")

c.timeZone = tz

//获取当前时间

if (setHour.text.toString()!=""&&setMin.text.toString()!="") {

c.set(Calendar.HOUR_OF_DAY, setHour.text.toString().toInt());//小时

c.set(

Calendar.MINUTE, setMin.text.toString().toInt()

);//分钟

c.set(Calendar.SECOND, 0);//秒

}

//计时发送通知

val mIntent = Intent(this, MyReceiver::class.java)

val mPendingIntent =

PendingIntent.getBroadcast(this, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT)

am = this

.getSystemService(Context.ALARM_SERVICE) as AlarmManager

if (setHour.text.toString()==""||setMin.text.toString()==""||

setHour.text.toString().toInt() > 24 || setMin.text.toString().toInt() > 60) {

Toast.makeText(this, "请输入正确的时间格式!", Toast.LENGTH_SHORT).show()

} else {

Log.d("fuck10", c.timeInMillis.toString())

am!!.setExactAndAllowWhileIdle(

AlarmManager.RTC_WAKEUP, c.timeInMillis,

mPendingIntent

)

Toast.makeText(this, "设置成功", Toast.LENGTH_SHORT).show()

}

}

其它方面如点击recyclerView中的Item重新编辑时对原数据的展现,用到了setText(),这里注意不要跟kotlin中setText()和getText()搞混。

大概所有功能差不多就这些了,毕竟只是个记事本应用

看完上述内容,是不是对Android如何实现记事本功能有进一步的了解,如果还想学习更多内容,欢迎关注亿速云行业资讯频道。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Android Studio记事本应用程序的实现示例: 1. 创建一个新的Android Studio项目,并在activity_main.xml文件中添加以下代码: ``` <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="top|start" android:inputType="textMultiLine" android:minLines="10" android:scrollbars="vertical" android:text="@string/default_text" /> ``` 2. 在MainActivity.java文件中添加以下代码: ``` public class MainActivity extends AppCompatActivity { private EditText mEditText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEditText = (EditText) findViewById(R.id.editText); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_save: saveFile(); return true; case R.id.action_open: openFile(); return true; case R.id.action_clear: clearText(); return true; default: return super.onOptionsItemSelected(item); } } private void saveFile() { String text = mEditText.getText().toString(); if (!TextUtils.isEmpty(text)) { try { File file = createFile(); FileOutputStream fos = new FileOutputStream(file); fos.write(text.getBytes()); fos.close(); Toast.makeText(this, "File saved successfully", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "Error saving file", Toast.LENGTH_SHORT).show(); } } } private void openFile() { try { File file = getFile(); FileInputStream fis = new FileInputStream(file); BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); sb.append("\n"); } reader.close(); mEditText.setText(sb.toString()); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "Error opening file", Toast.LENGTH_SHORT).show(); } } private void clearText() { mEditText.setText(""); } private File createFile() throws IOException { File dir = getFilesDir(); String fileName = "note.txt"; File file = new File(dir, fileName); if (!file.exists()) { file.createNewFile(); } return file; } private File getFile() { File dir = getFilesDir(); String fileName = "note.txt"; File file = new File(dir, fileName); return file; } } ``` 在这个代码中,我们创建了一个包含EditText的主活动,并在菜单中添加了保存,打开和清空文本的选项。当用户点击保存选项时,应用程序将文本保存到名为“note.txt”的文件中。当用户点击打开选项时,应用程序将打开名为“note.txt”的文件并将其文本显示在EditText中。当用户点击“清空”选项时,EditText将被清空。 请注意,此示例仅用于演示目的,并未进行输入验证或错误处理。在实际应用程序中,您应该执行更多的错误检查和验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值