メニュー

メニューファイルの追加

・res フォルダを右クリックして、[New] > [Android Resource File] を選択
・[Resource Type] を Menu に、[File Name] を 設定してOKをクリック

メニューオプション

id:ビューと同様にメニュー オプションにも ID があり、コード内で参照できます。
title:スクリーン リーダーがメニューを識別するのに役立ちます。
icon:表示アイコンファイル名
showAsAction:ボタンを表示する方法をシステムに指示します。「always」に設定されているため、このボタンは常にアプリバーに表示され、オーバーフロー メニューには含まれません。

menuのレイアウトファイルの例

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_switch_layout"
        android:title="@string/action_switch_layout"
        android:icon="@drawable/ic_linear_layout"
        app:showAsAction="always" />
</menu>

Kotlin側で状態に応じてメニューアイコンを変更する例

class MainActivity : AppCompatActivity() {
    private lateinit var recyclerView: RecyclerView

    // メニューの表示状態を表す変数
    private var isLinearLayoutManager = true

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        recyclerView = binding.recyclerView

        // 画面表示レイアウトを設定する
        chooseLayout()
    }

    // メニューの表示モードに合わせてリサイクラービューのレイアウトを変更する
    private fun chooseLayout() {
        if (isLinearLayoutManager) {
            recyclerView.layoutManager = LinearLayoutManager(this)
        } else {
            recyclerView.layoutManager = GridLayoutManager(this, 4)
        }
        recyclerView.adapter = LetterAdapter()
    }

    // メニューアイコンのセット
    private fun setIcon(menuItem: MenuItem?) {
        if (menuItem == null)
            return
        menuItem.icon =
            if (isLinearLayoutManager)
                ContextCompat.getDrawable(this, R.drawable.ic_grid_layout)
            else ContextCompat.getDrawable(this, R.drawable.ic_linear_layout)
    }

    // メニューの設定
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        // メニューのインフレート
        menuInflater.inflate(R.menu.layout_menu, menu)
        // アクションスイッチボタンの取得
        val layoutButton = menu?.findItem(R.id.action_switch_layout)
        // アイコンのセット
        setIcon(layoutButton)
        return true
    }

    // メニューボタン選択時の動作
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_switch_layout -> {
                // 値を反転させる
                isLinearLayoutManager = !isLinearLayoutManager
                // レイアウトの変更とアイコンの変更
                chooseLayout()
                setIcon(item)
                return true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }
}

トレーニング > KOTLIN を用いた ANDROID の基本 > ナビゲーション > 画面の移動 > アクティビティとインテント > 8. メニューとアイコンを設定する