Несколько фрагментов используют одну панель инструментов для отображения меню после поворота экрана. - PullRequest
0 голосов
/ 30 января 2019

Сценарий следующий: 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...