Очистить текст поиска в навигации.

У меня есть Activity с двумя дочерними фрагментами Timeline и Milestones. Оба этих фрагмента содержат списки, заполненные пользовательским адаптером курсора.

Вот графическое представление: введите здесь описание изображения

Теперь, когда я нахожусь в TIMELINE и открываю окно поиска, я набираю что-то, все хорошо, я получаю желаемый результат. Но когда я перехожу от временной шкалы к вехам с помощью some text in the searchview, представление поиска не очищается, поэтому я также получаю отфильтрованные результаты на странице вех и в соответствии с параметрами, которые я указал на временной шкале.

Я использую библиотеку AppCompact для разработки панели действий. Вкладки там не вкладки ActionBar, а простые SlidingTabLayout.

До сих пор я пытался использовать

getActivity().supportInvalidateOptionsMenu(); в onResume() обоих фрагментов не работает.

Я пробовал searchView.setQuery("",false) - не работает и случайным образом дает мне NPE.

Итак, что мне здесь не хватает?


person Skynet    schedule 14.04.2015    source источник
comment
Вы должны посмотреть на это решение: stackoverflow.com/questions/29144841/ Надеюсь, это поможет!   -  person Sohil R. Memon    schedule 14.04.2015
comment
Спасибо Сохил, я посмотрю там :)   -  person Skynet    schedule 14.04.2015


Ответы (1)


Вы можете взглянуть на мой пример, где я показал, как управлять searchView между фрагментами.

Во-первых. Вам нужно создать BaseFragment, который работает с контекстом активности с помощью appBarLayout.

open class BaseFragment: Fragment() {
    lateinit var rootActivity: MainActivity
    lateinit var appBarLayout: AppBarLayout
    lateinit var searchView: androidx.appcompat.widget.SearchView

    override fun onAttach(context: Context) {
        super.onAttach(context)

        this.rootActivity = context as MainActivity
        appBarLayout = rootActivity.findViewById(R.id.app_bar_layout)
        searchView = rootActivity.findViewById(R.id.search_input)
    }

    override fun onResume() {
        super.onResume()

        resetAppBarLayout()
    }

    private fun resetAppBarLayout() {
        appBarLayout.elevation = 14f
    }

    fun setupSearch(query: String) {
        searchView.visibility = View.VISIBLE
        searchView.clearFocus()
        when(query.isNotEmpty()) {
            true -> {
                searchView.setQuery(query, true)
                searchView.isIconified = false
            }
            false -> {
                searchView.isIconified = true
                searchView.isIconified = true
            }
        }
    }

    fun hideSearchKeyboard() {
        context?.let {
            KeyboardHelper.hideSearchKeyboard(it, searchView.findViewById(R.id.search_src_text))
        }
    }

    fun hideSearch() {
        searchView.visibility = View.GONE
        searchView.clearFocus()
    }
}

Во-вторых. Наследуйте свои фрагменты от BaseFragment, переопределите метод onResume() и управляйте searchView в своих фрагментах, вызывая методы из BaseFragment. Что-то вроде этого.

class FragmentA : BaseFragment() {
    private var searchQuery = ""

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val root = inflater.inflate(R.layout.fragment, container, false)
        val textView: TextView = root.findViewById(R.id.textView)
        textView.text = "Fragment A"
        return root
    }

    override fun onResume() {
        super.onResume()

        setupSearch()
    }

    private fun setupSearch() {
        searchView.setOnQueryTextListener(object : androidx.appcompat.widget.SearchView.OnQueryTextListener {
            override fun onQueryTextChange(newText: String?): Boolean {
                when(newText.isNullOrEmpty()) {
                    true -> searchQuery = ""
                    false -> searchQuery = newText
                }
                return true
            }

            override fun onQueryTextSubmit(query: String?): Boolean {
                hideSearchKeyboard()
                return true
            }
        })

        super.setupSearch(searchQuery)
    }
}

Полный пример вы можете найти здесь https://github.com/yellow-cap/android-manage-searchview

person Artem Chernousov    schedule 19.08.2020