【发布时间】: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检查此状态