как добавить фрагмент только один раз в backstack? - PullRequest
0 голосов
/ 24 марта 2020

Функциональность : у меня есть один 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)
    }

}

Пожалуйста, помогите.

...