[英]Kotlin icon setting in service
在我使用 kotlin 編寫的應用程序中,我每分鍾從服務器獲取狀態信息。 我想根據服務器的狀態信息更改菜單圖標。 我為此創建了一個 static 全局菜單變量,但圖標只改變一次,即使來自服務器的狀態信息發生變化,圖標也不會改變。
MainActivity.kt
companion object {
lateinit var menum: Menu
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu_main, menu)
menum = menu;
....
....
}
服務.kt
fun sync_check(){
if(LocalDbHash==SrvDbHash){
MainActivity.menum.findItem(R.id.sync_btn).setIcon(R.drawable.ic_edit)
}else{
MainActivity.menum.findItem(R.id.sync_btn).setIcon(R.drawable.ic_delete)
}
}
系統調用
onCreateOptionsMenu()
后,它會保留您填充的Menu
的一個實例,並且不會再次調用onCreateOptionsMenu()
,除非菜單因某種原因而無效。 但是,您應該只使用onCreateOptionsMenu()
來創建初始菜單 state 而不要在活動生命周期中進行更改。
如果要根據活動生命周期中發生的事件修改選項菜單,可以在
onPrepareOptionsMenu()
方法中進行。 此方法向您傳遞當前存在的Menu
object,以便您可以對其進行修改,例如添加、刪除或禁用項目。
在 Android 3.0 及更高版本上,當應用欄中顯示菜單項時,選項菜單被視為始終打開。 當一個事件發生,你想執行一個菜單更新,你必須調用
invalidateOptionsMenu()
來請求系統調用onPrepareOptionsMenu()
所以syncCheck
應該只設置一個“當前圖標”變量,然后調用invalidateOptionsMenu()
。 onPrepareOptionsMenu
將傳遞當前Menu
,您可以在那里進行更新。 就像是:
var syncButtonEdits = true
override fun onCreateOptionsMenu(menu: Menu): Boolean {
// inflate the basic menu
menuInflater.inflate(R.menu.menu_main, menu)
}
// this is called just before the menu is displayed
override fun onPrepareOptionsMenu(menu: Menu): Boolean {
menu.findItem(R.id.sync_btn).setIcon(
// set this icon according to the current state
if (syncButtonEdits) R.drawable.ic_edit else R.drawable.ic_delete
)
}
fun sync_check(){
syncButtonEdits = LocalDbHash==SrvDbHash
// calls onPrepareOptionsMenu, which will check the value of syncButtonEdits
invalidateOptionsMenu()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.