ActionBarでSearchViewを使うと意図せず他のアクションボタンが消えちゃう問題の解決策

Androidで`ActionBar`に`SearchView`のようなアクションビュークラスを使用してる時に発生するバグもどきに対する備忘録です。
# 問題の詳細
以下のコードで`SearchView`が開かれた（expand）状態でオーバーフローメニューをタップしたり`DialogFragment`を開いたりすると表示されていたアクションボタンがオーバーフローメニューに移り、更にその状態で`SearchView`を閉じると表示されていた`SearchView`を含めた全てのアクションボタンが消える。
<details><summary>動画</summary><div>

![再現動画](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/807403/10e9a9ad-a45b-7798-c0dd-f0a3ae1594b4.gif)
</div></details>

```xml:menu_main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/search_bar"
        android:icon="@drawable/ic_search"
        android:title="search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:iconTint="?attr/colorOnPrimarySurface"
        app:showAsAction="ifRoom|collapseActionView" />
    <item
        android:id="@+id/button1"
        android:icon="@drawable/ic_button1"
        android:title="button1"
        app:iconTint="?attr/colorOnPrimarySurface"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/button2"
        android:icon="@drawable/ic_button2"
        android:title="button2"
        app:iconTint="?attr/colorOnPrimarySurface"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/settings"
        android:title="settings"
        app:showAsAction="never" />
</menu>
```

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

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

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

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

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.button1, R.id.button2, R.id.settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }
}
```
# 問題の原因
`SearchView`を開いている時に`onPrepareOptionsMenu`が行われると
「`SearchView`が邪魔でアクションボタンが表示できない→仕方がないのでアクションボタンをオーバーフローメニューに入れる→`SearchView`が閉じられる→オーバーフローメニューに入れられたやつがどっかいく ~~（何故？）~~ 」という流れになるっぽい。
# 解決策
素直に「menu_main.xml」の`ifRoom`を全て`always`または`never`にすれば解決する。
```diff_xml:menu_main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/search_bar"
        android:icon="@drawable/ic_search"
        android:title="search"
        app:actionViewClass="androidx.appcompat.widget.SearchView"
        app:iconTint="?attr/colorOnPrimarySurface"
-       app:showAsAction="ifRoom|collapseActionView"
+       app:showAsAction="always|collapseActionView" />
    <item
        android:id="@+id/button1"
        android:icon="@drawable/ic_button1"
        android:title="button1"
        app:iconTint="?attr/colorOnPrimarySurface"
-       app:showAsAction="ifRoom"
+       app:showAsAction="always" />
    <item
        android:id="@+id/button2"
        android:icon="@drawable/ic_button2"
        android:title="button2"
        app:iconTint="?attr/colorOnPrimarySurface"
-       app:showAsAction="ifRoom"
+       app:showAsAction="never" />
    <item
        android:id="@+id/settings"
        android:title="settings"
        app:showAsAction="never" />
</menu>
```
ただし、どうしても`ifRoom`を変えたくないという場合は`onPrepareOptionsMenu`をオーバーライドして`SearchView`を無理やり閉ざしてやればいい。
```diff_kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding

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

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

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

+   override fun onPrepareOptionsMenu(menu: Menu): Boolean {
+       menu.findItem(R.id.search_bar).collapseActionView()
+       return true
+   }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.button1, R.id.button2, R.id.settings -> true
            else -> super.onOptionsItemSelected(item)
        }
    }
}
```