簡體   English   中英

Kotlin 圖標設置在服務中

[英]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)
    }
}

你想要onPrepareOptionsMenu代替

系統調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM