Функциональность : у меня есть один Editext в упражнении, из которого, если пользователь вводит как минимум 3 символа, мне нужно нажать на один API и получить из него результаты поиска, а затем отобразить эти результаты в одном фрагменте. «SearchResultsFragment» и пользователь могут переключиться на другой фрагмент ResultDetailsFragment из SearchResultsFragment, поэтому мне нужно поддерживать обратный стек здесь.
Проблема : в этом процессе добавляются несколько элементов SearchResultsFragment в обратный стек, поскольку пользователь повторно вводит данные / удаляет текст из edittext.
Что я пробовал: 1. Попытался проверить, находится ли фрагмент в backstack, если это так, я заменяю фрагмент, но он тоже не работает. 2. Некоторые советы не запускать фрагмент снова и снова и использовать некоторую функцию для помещения данных в этот фрагмент, но вот один из сценариев: если я нахожусь на ResultDetailsFragment и пользователь начинает печатать на edittext, тогда SearchResultsFragment уже находится в backstack, но не виден, так что функциональный подход здесь работать не будет.
Код:
searchText.addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable) {
}
override fun beforeTextChanged(
s: CharSequence, start: Int,
count: Int, after: Int
) {
}
override fun onTextChanged(
s: CharSequence, start: Int,
before: Int, count: Int
) {
if (s.length == 3) {
Log.e(TAG, "Fragment Exist: "+ isFragAdded())
val(status, searchFragment) = isFragAdded()
if(!status) {
supportFragmentManager.beginTransaction()
.add(
R.id.fragment_container,
searchFragment
,Constant.SEARCH_RESULTS_FRAGMENT).addToBackStack(null).commit()
}else{
supportFragmentManager.popBackStackImmediate(Constant.SEARCH_RESULTS_FRAGMENT, 0)
supportFragmentManager.beginTransaction()
.replace(
R.id.fragment_container,
searchFragment
,Constant.SEARCH_RESULTS_FRAGMENT).addToBackStack(null).commit()
}
}
}
})
и код для поиска фрагмента в backstack:
private fun isFragAdded(): Pair<Boolean, Fragment>{
val fm = supportFragmentManager
val fragment = fm.findFragmentByTag(Constant.SEARCH_RESULTS_FRAGMENT)
if(fragment == null){
return Pair(false,searchResultsFrag)
}else{
return Pair(true,fragment)
}
}
Пожалуйста, помогите.