IllegalStateException: невозможно показать фрагмент, присоединенный к другому FragmentManager - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь показать / скрыть фрагмент. В большинстве случаев он работает нормально, но очень редко я получаю cra sh java .lang.IllegalStateException: не удается отобразить фрагмент, присоединенный к другому FragmentManager.

У меня есть функция для отображения / скрытия фрагментов в деятельности.

private var previousFragment: Fragment? = null

private fun replaceFragment(fragment: Fragment) {
    val backStateName = fragment.javaClass.name
    val fragmentManager = supportFragmentManager
    val fragmentTransaction = fragmentManager.beginTransaction()

    if (!fragment.isAdded) {
        if (fragmentManager.findFragmentByTag(backStateName) == null) {
            fragmentTransaction
                .add(R.id.fragmentContainerView, fragment, backStateName)
        }
    }

    if (previousFragment != null)
        fragmentTransaction.hide(previousFragment!!)

    fragmentTransaction.show(fragment)
    fragmentTransaction.commitAllowingStateLoss()

    previousFragment = fragment
}

Что здесь не так?

1 Ответ

0 голосов
/ 16 апреля 2020

В качестве начального кода я бы начал отсюда:

    private var previousFragment: Fragment? = null


    private object mOnNavigationListener : OnNavigationItemSelectedListener {
        override fun onNavigationItemSelected(item: MenuItem): Boolean {
            when (item.itemId) {
                R.id.home -> return true
                R.id.fragmentA -> {
                    fragment = FragmentA()
                    replaceFragment(fragment)
                    return true
                }
                R.id.fragmentB -> {
                    fragment = FragmentB()
                    replaceFragment(fragment)
                    return true
                }
            }
            return false
        }
    }


    private fun replaceFragment(fragment: Fragment) {
        val fragmentManager = supportFragmentManager
        val fragmentTransaction = fragmentManager.beginTransaction()

        fragmentTransaction
          .replace(R.id.fragmentContainerView, fragment)
          .commit();

        previousFragment = fragment;
    }

Ссылки на начало:
1. Вид навигации снизу с фрагментами (без повторного создания фрагмента)
2. Нижняя навигация
3. Code Labs
4. Нижняя навигация Tutorial

...