07-20-2023, 09:08 AM
Adding to the above answers, I prefer creating an extension function to reduce boilerplate code:
Extension function implementation:
fun Fragment.setupMenu(@MenuRes menuId: Int, onMenuSelected: (MenuItem) -> Boolean) =
(requireActivity() as MenuHost).addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) =
menuInflater.inflate(menuId, menu)
override fun onMenuItemSelected(menuItem: MenuItem) = onMenuSelected(menuItem)
}, viewLifecycleOwner, Lifecycle.State.RESUMED)
This way, you will always insure you are adding the `lifeCycleOwner` and passing the correct `lifecycle state` which is `Lifecycle.State.RESUMED`
And you can simply use this inside fragment calling:
setupMenu(R.menu.menu_save) { menuItem ->
when (menuItem.itemId) {
R.id.save -> {
viewModel.onSaveClicked()
true
}
else -> false
}
}
Extension function implementation:
fun Fragment.setupMenu(@MenuRes menuId: Int, onMenuSelected: (MenuItem) -> Boolean) =
(requireActivity() as MenuHost).addMenuProvider(object : MenuProvider {
override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) =
menuInflater.inflate(menuId, menu)
override fun onMenuItemSelected(menuItem: MenuItem) = onMenuSelected(menuItem)
}, viewLifecycleOwner, Lifecycle.State.RESUMED)
This way, you will always insure you are adding the `lifeCycleOwner` and passing the correct `lifecycle state` which is `Lifecycle.State.RESUMED`
And you can simply use this inside fragment calling:
setupMenu(R.menu.menu_save) { menuItem ->
when (menuItem.itemId) {
R.id.save -> {
viewModel.onSaveClicked()
true
}
else -> false
}
}