【问题标题】:IllegalStateException: Cannot show Fragment attached to a different FragmentManagerIllegalStateException:无法显示附加到不同 FragmentManager 的 Fragment
【发布时间】:2020-04-16 08:32:34
【问题描述】:

我正在尝试显示/隐藏片段。它在大多数情况下都可以正常工作,但很少发生崩溃 java.lang.IllegalStateException: Cannot show Fragment attach to a different FragmentManager。

我有一个在 Activity 中显示/隐藏片段的功能。

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
}

这里有什么问题?

【问题讨论】:

  • 首先为什么要使用add而不是replace?
  • 因为我在activity中使用了BottomNavigationView
  • 我也使用了底部导航,当我想替换片段时,我从来不需要使用添加。
  • 你能告诉我代码和添加有什么问题吗?
  • 我在片段中有滚动视图,如果我使用替换,则片段滚动回顶部,但如果我使用添加,则 scollview 没有问题

标签: android android-fragments


【解决方案1】:

作为起始代码,我将从这里开始:

    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.Bottom Navigation View With Fragments (No fragment re-creation)
2.Bottom navigation
3.Code Labs
4.Bottom Nav Tutorial

【讨论】:

  • 我使用了第一个链接,有时也会抛出同样的错误
猜你喜欢
  • 2020-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多