今天練習的主軸,就是要來完成右上角垃圾桶的設定,關於這個小小的 UI 元件,其實還滿多事情要來做的:
垃圾桶的顏色會隨著 enable 狀態改變,呈現白色時可以被點擊(enable = true),呈現灰色時不可被點擊觸發事件(enable = false),這種狀態變動的呈現,可以使用 selector 狀態選擇器 來做,細節參考這裡:
首先在 res 增加一個 color 資料夾
使用文章提及的第一種方法「以 xml 方式寫 selector」,加入一個 xml 檔案
這次用到的狀態是 state_enabled
,使用方式就是「改變項目+依據狀態」(color + enable)
android:state_enabled
设置触摸或点击事件是否可用状态,一般只在false时设置该属性,表示不可用状态
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="#FFFFFF" android:state_enabled="true" />
<item android:color="#444444" android:state_enabled="false" />
</selector>
可以直接從紅色框框處看到設定的顏色
現在可以看到垃圾桶顏色變成灰色,因為預設就是 enable=false,現在要做的就是勾選資料 CheckBox 的同時,要讓垃圾桶變成白色,也就是 enable=true
lateinit var itemDelete: MenuItem
onCreateOptionsMenu(menu: Menu?)
方法中,可以透過 findItem
來獲取具體的 Item,在這裡我們可以賦值 itemDelete,這樣從外面就可以取得 itemDelete = menu!!.findItem(R.id.menu_delete)
itemDelete.isEnabled
,因為沒有限定是哪一筆資料的 CheckBox 被點擊,所以使用陣列方法 list.find()
來檢查: itemDelete.isEnabled = things.find { it.isSelected }?.isSelected ?: false
.isSelected
時,垃圾桶狀態就是.isEnabled
chk_delete.isChecked = thing.isSelected //(Adapter.kt)
?:
---這裡使用到安全調用操作符
如果 ?: 左侧表达式非空,elvis 操作符就返回其左侧表达式,否则返回右侧表达式,注意仅当左侧为空时,才会对右侧表达式求值
要修改 SharedPreferences 裡面的資料,跟新增一樣需要取得 editor 物件,也只有讀取資料才用不到 Editor:
在 onOptionsItemSelected(item: MenuItem)
裡面對垃圾桶做點擊事件:
list.filter()
找出被點選的資料 val deleteList = things.filter { it.isSelected }
filter() 和 find() 很像,但後者只會回傳第一次為 true 的值,而 filter() 會回傳一個陣列,即為 true 的值們,這裡回傳的東西是 List,filter() 這個方法很適合用在搜尋符合條件的資料們
list.forEach()
執行刪除程序deleteList.forEach { editor.remove(it.key) }
接下來,使用 Key 值來移除每一項資料,forEach() 不會額外回傳值,只單純執行每個陣列內的物件或值,用法類似 for 迴圈、只是更為簡單,做完之後記得讓 .apply() 執行,還要讓垃圾桶可點選按鈕重回預設值
→ 關於陣列處理的技巧,延伸參考 JavaScript 陣列處理方法
when(item.itemId){
R.id.menu_delete ->{
val editor = getSharedPreferences("save", Activity.MODE_PRIVATE).edit()
val deleteList = things.filter { it.isSelected }
deleteList.forEach { editor.remove(it.key) }
editor.apply()
itemDelete.isEnabled = false
getEvent()
}
}
這樣就做完刪除功能的設定囉~