【问题标题】:Fragment has not been attached yet片段尚未附加
【发布时间】:2019-10-28 16:42:38
【问题描述】:

阅读有关此异常的帖子后,我不明白我需要做什么来纠正此错误。此外,我什至无法重现它...有时在某些设备上会发生这种情况,但我不明白如何...

我的日志:

Fatal Exception: java.lang.IllegalStateException
Fragment a has not been attached yet my.app.HostFragment.addFragment

HostFragment 类:

fun addFragment(fragment: Fragment) {
        childFragmentManager.beginTransaction()
          .add(R.id.fragment_root_container, fragment)
          .addToBackStack(null)
          .commit()
}

MainActivity 类:

fun openNewChampionFragment() {
        val hostFragment = pagerAdapter.getItem(viewpager.currentItem) as HostFragment
        hostFragment.addFragment(ChampionFragment.newInstance())
}

ViewPager 适配器:

class ViewPagerAdapter(manager: FragmentManager) : FragmentStatePagerAdapter(manager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {

    private var fragments: MutableList<Fragment> = mutableListOf()

    fun addFragments(fragments: List<Fragment>) {
        this.fragments = fragments.toMutableList()
    }

    override fun getItem(position: Int): Fragment {
        return fragments[position]
    }

    override fun getCount(): Int {
        return fragments.size
    }

    fun clearStack(index: Int){
        (fragments[index] as HostFragment).clearAllStack()
    }
}

我总是用一个新的片段实例从我的MainActivity 调用addFragment(我不重用旧片段的实例。)

哪个片段没有被附加?我的 HostFragment 或我尝试添加的新 HostFragment。

【问题讨论】:

  • 由于您使用的是childFragmentManager,因此您似乎正在向片段添加片段。此方法必须在某个 Fragment 类中,但您说您是从 MainActivity 调用它...如果将该方法移至 MainActivity 并使用 supportFragmentManager 而不是 childFragmentManager 会发生什么?
  • 每个 HostFragment 都是一个 Fragment 栈。所以我需要使用childFragmentManager
  • 所以可能您的 HostFragment 尚未添加到您的活动中,因此它不能有子片段。请记住,片段事务是异步的。
  • Ben P. 谢谢。我将使用isAdded 检查此状态

标签: android kotlin fragment


【解决方案1】:

您的应用程序崩溃,因为FragmentStatePagerAdapter 的实现不正确。

// private var fragments: MutableList<Fragment> = mutableListOf() // <-- remove this line entirely

您不能在Fragment*PagerAdapter 中保留片段列表,因为系统会重新创建片段,而您将在该列表中调用的片段将永远不会真正添加到片段管理器。

您可以将FragmentStatePagerAdapter切换为FragmentPagerAdapter,然后您可以申请App crash after activity has been killed in background和How to get elements of fragments created by ViewPager in MainActivity?。

要重现您的崩溃,请参阅Singleton object becomes null after app is resumed。

【讨论】:

  • 谢谢!我可以使用终止按钮重现崩溃。我会尝试您的解决方案并阅读其他帖子!
  • 我在解决问题时遇到了麻烦。你做过示例项目吗?
  • 你需要使用FragmentPagerAdapter并在getItem中返回一个新的Fragment实例。
  • 好的!我终于成功了 ^^ 非常感谢你......如果我自己找到它会非常复杂。
  • @ZachBvy 我找到了命令,它是am kill,正如codelabs.developers.google.com/codelabs/android-lifecycles/#6 中的adb shell am kill com.example.android.codelabs.lifecycle 中所说的那样
猜你喜欢
  • 2020-08-27
  • 1970-01-01
  • 2023-03-26
  • 2014-03-06
  • 2021-09-02
  • 2012-06-10
  • 2022-07-03
  • 2021-09-28
  • 2015-04-24
相关资源
最近更新 更多