Похоже, что использование setSupportActionBar(toolbar)
в методе onCreate()
MainActivity решает проблему с непостоянством optionsMenu. Однако это нарушает метод, который я использовал для отображения заголовка на фрагменте windows.
Панель инструментов принадлежит Activity, а не фрагменту. Поэтому, когда представление воссоздается после изменения ориентации, на панели инструментов устанавливается заголовок приложения. Этого не происходит, когда фрагмент загружается впервые, так как заголовок был установлен onCreate()
фрагмента. Решением было переместить настраиваемые заголовки в onResume()
фрагмента, чтобы они сбрасывались каждый раз, когда представление отображается на экране.
Я устанавливаю заголовок во фрагменте, как это , потому что если я позволю контроллеру навигации делать это с помощью меток в навигации. xml Я получаю странное поведение, когда фрагмент загружается, когда настраиваемый макет панели инструментов заменяется новым типом заголовка фрагмента, мигает справа.
Таким образом, сводный код для этого решения:
Фрагмент:
class SingleRecipeFragment : Fragment() {
override fun onCreateView(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
}
override fun onResume() {
super.onResume()
/** This will reset your title every time the fragment is redrawn **/
(requireActivity() as MainActivity).toolbar.title = "Some Custom Title"
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.single_recipe_menu, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.share -> someMethodYouWantToRun()
R.id.favorite -> someOtherMethod()
}
return super.onOptionsItemSelected(item)
}
}
В onCreate()
вашего Activity, вызовите:
setSupportActionBar(toolbar)
А вот файл ресурсов макета меню, расширяемый для меню параметров (без изменений по сравнению с тем, что в вопросе):
<?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/share"
android:enabled="true"
android:icon="@drawable/ic_baseline_share_24"
android:title="Share"
android:visible="true"
app:showAsAction="ifRoom" />
<item
android:id="@+id/favorite"
android:enabled="true"
android:icon="@drawable/ic_baseline_star_border_24"
android:title="Share"
android:visible="true"
app:showAsAction="ifRoom" />
</menu>