Сценарий следующий: 1. Открытие первого фрагмента, в котором указано setHasOptionsMenu(true)
, поиск вида панели инструментов из макета в onViewCreated
и установка его на действие через интерфейс класса AppCompatActivity
(setSupportActionBar
).Кроме того, он переопределяет onCreateOptionsMenu
и устанавливает меню с одним SearchView
.2. Откройте второй фрагмент, используя ту же активность FragmentManager
, которая использовалась для открытия первого фрагмента.Восстанавливает все объявления, относящиеся к меню, но вместо этого в меню с SearchView
меню имеет только значок.3. Измените ориентацию устройства (поверните).Затем сначала восстанавливается первый фрагмент, и вызывается его метод onViewCreated
, где AppCompatActivity
получает свой Toolbar
в setSupportActionBar
метод.Затем та же процедура будет вызвана для второго фрагмента (все эти действия выполняются автоматически через механизм восстановления состояния).
И при нажатии кнопки «Назад» на панели инструментов активного фрагмента происходит, когда анимация затухания работает, чтоSearchView
первого фрагмента виден здесь, и когда на первом фрагменте присутствует панель инструментов завершения маршрутизации, но не SearchView
(и, кроме того, кнопка возврата на панели инструментов ничего не делает).
При повороте устройства назад панель инструментов раздувается нормально.
Вот код первого фрагмента:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
this.toolbar(
toolbarId = R.id.toolbar_first_fragment,
title = getString(R.string.first_fragment_title),
textColor = android.R.color.black,
indicatorColor = android.R.color.black
)
this.view = FirstFragmentView(view, savedInstanceState, childFragmentManager)
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater?) {
super.onCreateOptionsMenu(menu, inflater)
menu?.clear()
inflater!!.inflate(R.menu.menu_scenarios, menu)
}
override fun onPrepareOptionsMenu(menu: Menu?) {
super.onPrepareOptionsMenu(menu)
if (view.menuItem == null) {
val menuItem: MenuItem = menu!!.findItem(R.id.action_search)
val searchView: SearchView = menuItem.actionView!! as SearchView
view.withSearchView(menuItem, searchView)
addOnQueryListener(searchView)
setSignalingExpandListener()
}
}
Код второго фрагмента:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
this.toolbar(
indicatorColor = android.R.color.black,
textColor = android.R.color.black,
title = arguments!!.getString(KEY_CONTEXT)!!
)
}
override fun onCreateOptionsMenu(menu: Menu?, inflater: MenuInflater) {
menu?.clear()
inflater.inflate(R.menu.menu_scenario_details, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == R.id.settings_menu_item) {
scenariosRoadmap.scenarioSettings()
return true
}
return super.onOptionsItemSelected(item)
}
toolbar
метод расширения:
fun Fragment.toolbar(
toolbarId: Int = R.id.toolbar,
title: CharSequence = "",
textColor: Int = R.color.colorPrimary,
backShown: Boolean = true,
indicatorId: Int? = null,
indicatorColor: Int = R.color.colorPrimary
) {
val toolbar = this.view!!.findViewById<Toolbar>(toolbarId)
compatActivity.setSupportActionBar(toolbar)
activity!!.title = title
val supportActionBar = compatActivity.supportActionBar
supportActionBar!!.setDisplayHomeAsUpEnabled(backShown)
if (indicatorId != null) {
supportActionBar.setHomeAsUpIndicator(indicatorId)
}
toolbar.navigationIcon?.setColorFilter(ContextCompat.getColor(context!!, indicatorColor), PorterDuff.Mode.SRC_ATOP)
toolbar.setTitleTextColor(ContextCompat.getColor(context!!, textColor))
}
val Fragment.compatActivity: AppCompatActivity
get() = activity!! as AppCompatActivity