You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何知晓Activity中Toolbar菜单视图zone0何时可访问?

解决方案

方法1:利用onPrepareOptionsMenu回调

系统准备显示菜单时会触发这个方法,此时菜单项视图已完成初始化,可直接访问修改:

override fun onPrepareOptionsMenu(menu: Menu): Boolean {
    val menuItem = menu.findItem(R.id.zone0)
    val itemView = menuItem.actionView as? ItemView
    val icon0 = ResourcesCompat.getDrawable(resources, id0, null)
    itemView?.setIcon(icon0)
    return super.onPrepareOptionsMenu(menu)
}

后续若需动态更新菜单,调用invalidateOptionsMenu()即可重新触发该方法。

方法2:监听Toolbar布局完成事件

如果zone0是Toolbar布局文件中直接定义的ImageView,可通过ViewTreeObserver监听布局完成时机:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val toolbar = findViewById<Toolbar>(R.id.toolbar)
    setSupportActionBar(toolbar)
    
    toolbar.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            // 移除监听避免重复执行
            toolbar.viewTreeObserver.removeOnGlobalLayoutListener(this)
            val icon0 = ResourcesCompat.getDrawable(resources, id0, null)
            (findViewById<View>(R.id.zone0) as? ItemView)?.setIcon(icon0)
        }
    })
}

方法3:用View.post()延迟执行

将操作放入UI队列尾部,等待视图布局完成后再执行:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val toolbar = findViewById<Toolbar>(R.id.toolbar)
    setSupportActionBar(toolbar)
    
    toolbar.post {
        val icon0 = ResourcesCompat.getDrawable(resources, id0, null)
        (findViewById<View>(R.id.zone0) as? ItemView)?.setIcon(icon0)
    }
}

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:09:55