OptionsMenu из фрагмента в ViewPager зависает после отображения дочернего DialogFragment - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть активность с ViewPager, которая содержит 4 фрагмента.В одном из фрагментов, отображающих контакты, я добавил OptionsMenu с действием SearchView.

Изначально все работает отлично, OptionsMenu отображается, когда загружается этот конкретный фрагмент, но как только появляется дочерний DialogFragment, OptionsMenu не может обновиться.Если какой-то DialogFragment открыт во фрагменте контактов (тот, что с OptionsMenu), то MenuItem остается видимым везде в приложении.Если какой-то DialogFragment открывается из других частей приложения, то MenuItem остается скрытым, даже если пользователь возвращается к фрагменту контактов.Чего мне не хватает?

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    setHasOptionsMenu(true)  
}

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.contacts_menu, menu)
    super.onCreateOptionsMenu(menu, inflater)
}

override fun onPrepareOptionsMenu(menu: Menu?) {
    super.onPrepareOptionsMenu(menu)
    menu?.let {
        val searchItem = menu.findItem(R.id.search)
        setupSearchView(searchItem)
    }
}

override fun onOptionsItemSelected(item: MenuItem?): Boolean {
    return when (item?.itemId) {
        R.id.search -> {
            item.expandActionView()
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}

private fun setupSearchView(searchItem: MenuItem) {
    val searchView = searchItem.actionView as SearchView
    val clearButton = searchView.findViewById<ImageView>(R.id.search_close_btn)

    val searchViewLayoutParams = searchView.findViewById<LinearLayout>(R.id.search_edit_frame).layoutParams as LinearLayout.LayoutParams
    searchViewLayoutParams.leftMargin = 0

    searchView.setOnQueryTextListener(object: SearchView.OnQueryTextListener {
        override fun onQueryTextSubmit(query: String?): Boolean {
            query?.let {
                if(query.isBlank()) {
                    showProperContacts(RESTORE_CONTACTS)
                } else {
                    showProperContacts(query = it)
                }
            }
            return false
        }

        override fun onQueryTextChange(query: String?): Boolean {
            query?.let {
                showProperContacts(query = it)
            }
            return false
        }
    })

    searchItem.setOnActionExpandListener(object: MenuItem.OnActionExpandListener {
        override fun onMenuItemActionExpand(item: MenuItem?): Boolean = true

        override fun onMenuItemActionCollapse(item: MenuItem?): Boolean {
            showProperContacts(RESTORE_CONTACTS)
            animateFilter(true)
            return true
        }

    })

    clearButton.setOnClickListener {
        searchView.setQuery("", true)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...