記録

主にAndroidアプリ開発に関する知見やその周辺に関わることについて記事をかいています

MenuItemの文字色を動的に変更する

MenuItemのtitleにSpannableStringBuilderで加工したテキストを渡してあげる。なので色以外も変更できる。

val titleText = menuItem.title
val builder = SpannableStringBuilder(titleText)
val colorSpan = ForegroundColorSpan(color)
builder.setSpan(colorSpan, 0, titleText.length, SpannableStringBuilder.SPAN_EXCLUSIVE_EXCLUSIVE)
menuItem.title = builder

MenuItemの取得方法

Toolbarに直接Menuをinflateしている場合はToolbarのMenuから取得できる。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(binding.root)
    binding.toolbar.inflateMenu(R.menu.hoge)
    val menuItem: MenuItem = binding.toolbar.menu.findItem(R.id.piyo)
}

onCreateOptionsMenuでMenuをinflateしてる場合は、onPrepareOptionsMenuを invalidateOptionsMenu() で呼び出しMenuItemを取得し処理する。

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.hoge, menu)
    return true
}

override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
    val menuItem: MenuItem? = menu?.findItem(R.id.piyo)
    return true
}