Android實(shí)現(xiàn)記事本小功能
本文實(shí)例為大家分享了Android實(shí)現(xiàn)記事本功能的具體代碼,供大家參考,具體內(nèi)容如下
首先聲明,本人是android的小白,主要是新人項(xiàng)目寫了這個(gè)程序,思路可能不是很清晰,可優(yōu)化的地方也有很多,望路過(guò)的大佬不吝賜教。
該記事本包含創(chuàng)建新條目,數(shù)據(jù)庫(kù)增刪改查,條目可編輯,滑動(dòng)刪除與拖拽排序,簡(jiǎn)單鬧鐘實(shí)現(xiàn)(還有個(gè)簡(jiǎn)陋背景音樂(lè)開關(guān)就不提了太簡(jiǎn)單),接下來(lái)逐一介紹一下。
build.gradle導(dǎo)入
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"
沒(méi)什么多說(shuō)的。
Room數(shù)據(jù)庫(kù)
room數(shù)據(jù)庫(kù)相比于sqlite來(lái)說(shuō)對(duì)新人確實(shí)友好很多,在沒(méi)有SQL基礎(chǔ)的前提下,增刪改查等實(shí)現(xiàn)都很簡(jiǎn)單,只需創(chuàng)建一個(gè)實(shí)例,便可在線程中進(jìn)行。具體代碼為
①接口:
@Dao
interface NoteDao {
@Update
fun updateNote(newNote: Note)
@Query("select * from Note")
fun loadAllNotes(): List<Note>
@Query("select * from Note where title > :title")
fun loadNotesLongerThan(title:String) : List<Note>
@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類(獲取實(shí)例
@Database(version = 1, entities = [Note::class])
abstract class AppDatabase: RoomDatabase(){
abstract fun noteDao() : NoteDao
companion object{
//訪問(wèn)實(shí)例
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
}
}
}
}
滑動(dòng)刪除和拖拽排序
class RecycleItemTouchHelper(private val helperCallback: ItemTouchHelperCallback) :
ItemTouchHelper.Callback() {
//設(shè)置滑動(dòng)類型標(biāo)記
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
}
//滑動(dòng)
override fun isItemViewSwipeEnabled(): Boolean {
return true
}
//拖拽回調(diào)
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
helperCallback.onMove(viewHolder.adapterPosition, target.adapterPosition)
return true
}
//滑動(dòng)
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int): Unit {
helperCallback.onItemDelete(viewHolder.adapterPosition)
}
//狀態(tài)回調(diào)
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接口實(shí)現(xiàn)
拖拽排序和滑動(dòng)刪除后即更新一次,這種方法并不好,畢竟沒(méi)有用到MVVM中的高級(jí)組件,包括觀察者,Livedata,ViewModel察覺(jué)數(shù)據(jù)變化并提示更新。建議在這種方法的前提下可以考慮在從Activity離開后,再數(shù)據(jù)更新。
注:千萬(wàn)不要在**onPause()**中涉及數(shù)據(jù)更新和保存?。。?/p>
//拖拽排序
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)
}
}
//排序后的數(shù)據(jù)更新
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)
}
簡(jiǎn)易鬧鐘實(shí)現(xiàn)
broadcast類需要自己實(shí)現(xiàn)
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()
}
}
這里只是發(fā)個(gè)廣播通知,并沒(méi)有提示聲音,可以采取發(fā)到通知欄的方式,系統(tǒng)會(huì)有提示音。涉及到AlarmManager類
NoteActivity中的實(shí)現(xiàn):
setBtn.setOnClickListener { view ->
val c = Calendar.getInstance()
//調(diào)整為中國(guó)時(shí)區(qū),不然有8小時(shí)差比較麻煩
val tz = TimeZone.getTimeZone("Asia/Shanghai")
c.timeZone = tz
//獲取當(dāng)前時(shí)間
if (setHour.text.toString()!=""&&setMin.text.toString()!="") {
c.set(Calendar.HOUR_OF_DAY, setHour.text.toString().toInt());//小時(shí)
c.set(
Calendar.MINUTE, setMin.text.toString().toInt()
);//分鐘
c.set(Calendar.SECOND, 0);//秒
}
//計(jì)時(shí)發(fā)送通知
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, "請(qǐng)輸入正確的時(shí)間格式!", Toast.LENGTH_SHORT).show()
} else {
Log.d("fuck10", c.timeInMillis.toString())
am!!.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP, c.timeInMillis,
mPendingIntent
)
Toast.makeText(this, "設(shè)置成功", Toast.LENGTH_SHORT).show()
}
}
其它方面如點(diǎn)擊recyclerView中的Item重新編輯時(shí)對(duì)原數(shù)據(jù)的展現(xiàn),用到了setText(),這里注意不要跟kotlin中setText()和getText()搞混。
大概所有功能差不多就這些了,畢竟只是個(gè)記事本應(yīng)用。
所有代碼放在github上面了,如有需要,請(qǐng)自取
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)簡(jiǎn)易記事本
- Android記事本項(xiàng)目開發(fā)
- Android實(shí)現(xiàn)記事本功能
- Android實(shí)現(xiàn)簡(jiǎn)易記事本
- android實(shí)現(xiàn)記事本app
- Android+SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)的生詞記事本功能實(shí)例
- Android中實(shí)現(xiàn)記事本動(dòng)態(tài)添加行效果
- Android實(shí)現(xiàn)記事本功能(26)
- Android利用Intent實(shí)現(xiàn)記事本功能(NotePad)
- Android手機(jī)開發(fā)設(shè)計(jì)之記事本功能
相關(guān)文章
Android中RecyclerView實(shí)現(xiàn)分頁(yè)滾動(dòng)的方法詳解
RecyclerView實(shí)現(xiàn)滾動(dòng)相信對(duì)大家來(lái)說(shuō)都不陌生,但是本文主要給大家介紹了利用Android中RecyclerView實(shí)現(xiàn)分頁(yè)滾動(dòng)的思路和方法,可以實(shí)現(xiàn)翻頁(yè)功能,一次翻一頁(yè),也可以實(shí)現(xiàn)翻至某一頁(yè)功能。文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-04-04
簡(jiǎn)述Android中實(shí)現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法
本篇文章主要對(duì)Android中實(shí)現(xiàn)APP文本內(nèi)容的分享發(fā)送與接收方法進(jìn)行介紹,相信對(duì)大家學(xué)習(xí)會(huì)有很好的幫助,需要的朋友一起來(lái)看下吧2016-12-12
HorizontalScrollView水平滾動(dòng)控件使用方法詳解
這篇文章主要為大家詳細(xì)介紹了HorizontalScrollView水平滾動(dòng)控件的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android編程實(shí)現(xiàn)簡(jiǎn)單的UDP Client實(shí)例
這篇文章主要介紹了Android編程實(shí)現(xiàn)簡(jiǎn)單的UDP Client,結(jié)合實(shí)例形式分析了Android實(shí)現(xiàn)UDP Clinet客戶端的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-04-04
android加載系統(tǒng)相冊(cè)圖片并顯示詳解
大家好,本篇文章主要講的是android加載系統(tǒng)相冊(cè)圖片并顯示詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
Android實(shí)現(xiàn)自定義驗(yàn)證碼輸入框效果(實(shí)例代碼)
這篇文章主要介紹了Android實(shí)現(xiàn)自定義驗(yàn)證碼輸入框效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
Android開發(fā)實(shí)現(xiàn)判斷通知欄是否打開及前往設(shè)置頁(yè)面的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)判斷通知欄是否打開及前往設(shè)置頁(yè)面的方法,涉及Android通知欄的打開、判斷、設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Android實(shí)現(xiàn)五子棋游戲(局域網(wǎng)版)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)局域網(wǎng)版的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05

