如何知晓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
相关产品推荐
相关产品推荐

