Фрагменты Резюме: Показать и скрыть транзакции не работают - PullRequest
0 голосов
/ 19 сентября 2018

Я хочу возобновить фрагменты Android, которые находятся в backstack.При переключении между различными вкладками в нижней навигации, я не хочу, чтобы воссоздались виды фрагментов.

Я читаю это , это , это и некоторые другие вопросы, связанные со стековым потоком, связанные с этим.Распространенными предложениями является использование метода show and hide для фрагментных транзакций, но он не работает.Вот мой код котлина:

    bottomnavigation.setOnNavigationItemSelectedListener {
        item ->
        when(item.itemId){
            R.id.first_fragment_item -> {
                var fragment:Fragment = FirstFragment.newInstance()
                replaceFragment(fragment)
                return@setOnNavigationItemSelectedListener true
            }
            R.id.second_fragment_item -> {
                var fragment:Fragment = SecondFragment.newInstance()
                replaceFragment(fragment)
                return@setOnNavigationItemSelectedListener true
            }

        }
        return@setOnNavigationItemSelectedListener false

    }

}

  fun replaceFragment(fragment:Fragment) {

    var fragmentName:String = fragment::class.simpleName!!

    if(supportFragmentManager.findFragmentByTag(fragmentName)==null) {
        val fragmentTransaction = supportFragmentManager.beginTransaction()
        fragmentTransaction.replace(R.id.fragment_container, fragment, fragmentName)
        fragmentTransaction.addToBackStack(fragmentName)
        fragmentTransaction.commit()
    }
    else{
        if(fragmentName == "FirstFragment") {
            supportFragmentManager.beginTransaction().
                     hide(supportFragmentManager.findFragmentByTag("SecondFragment"))
                    .show(supportFragmentManager.findFragmentByTag("FirstFragment"))
                    .commit()
        }
        else{
            supportFragmentManager.beginTransaction()
                    .hide(supportFragmentManager.findFragmentByTag("FirstFragment"))
                    .show(supportFragmentManager.findFragmentByTag("SecondFragment"))
                    .commit()
        }
    }

}

Последний фрагмент backstack всегда отображается.Когда я хочу спрятать его и показать другой фрагмент, экран этого фрагмента становится белым, на нем ничего нет.

В моей нижней навигации есть четыре элемента, но для целей тестирования я использую только два.Два из фрагментов - это FirstFragment и SecondFragment.Я использую v4.app.fragments.

1 Ответ

0 голосов
/ 19 сентября 2018

С помощью комментариев Кишан Вирамгама я решил свою проблему.Я использовал метод «добавить» вместо «заменить».Это мой код для возобновления фрагментов: `

fun replaceFragment(fragment: Fragment) {
    var nameOfFragment: String? = fragment::class.simpleName
    var fragmentTransaction = supportFragmentManager.beginTransaction()
    var fm: FragmentManager = supportFragmentManager
    if (supportFragmentManager.findFragmentByTag(nameOfFragment) == null) {
        fragmentTransaction.add(R.id.root_fragments, fragment, nameOfFragment)      //if fragment is not added to the backstack,add it/ don't use replace because it creates new fragment emptying fragment container
        fragmentTransaction.addToBackStack(nameOfFragment)
        fragmentTransaction.commit()
    } else {
        var fragmentToShow:Fragment = supportFragmentManager.findFragmentByTag(nameOfFragment) //if fragment is already in backstack,show it and hide all other fragments.
        for (i in 0 until fm.backStackEntryCount) {
            var fragmentToHide: Fragment = fm.findFragmentByTag(fm.getBackStackEntryAt(i).name)
            if (fragmentToHide::class.simpleName != fragment::class.simpleName)
                fragmentTransaction.hide(fragmentToHide)
        }
        fragmentTransaction.show(fragmentToShow)
        fragmentTransaction.commit()
    }

}

`

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...