一部のFragmentでのみ、とあるメニューを表示したかったのですが、メニューのvisiblityをうまくコントロールできず困りました。
というのも、ActivityからはonCreateOptionsMenu()やonPrepareOptionsMenu()が呼べるのに、Fragmentからは呼べませんでした。
すごくシンプルなのですが、
HogeFragment.kt
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
setHasOptionsMenu(true)
(略)
}
これだけでした。
setHasPotionsMenu(true)を呼べば、onPrepareOptionsMenu()やonCreateOptionsMenu()も呼ばれます。
<item
android:id="@+id/hoge"
android:icon="@drawable/ic_hoge_24"
android:title="@string/hoge_string"
app:showAsAction="ifRoom"
android:visible="false" />
あとはこんな感じでメニューをあらかじめ非表示にしておいて、表示したい特定のFragmentにおいて
HogeFragment.kt
override fun onPrepareOptionsMenu(menu: Menu) {
super.onPrepareOptionsMenu(menu)
val item = menu.findItem(R.id.hoge)
item.isVisible = true
item.setOnMenuItemClickListener {
// クリックリスナーも機能します
return@setOnMenuItemClickListener true
}
}
こんな感じでvisibleをtrueにできます。