阅读有关此异常的帖子后,我不明白我需要做什么来更正此错误。此外,我什至无法重现它...有时会在某些设备上发生这种情况,但我不明白如何...
我的日志:
Fatal Exception: java.lang.IllegalStateException
Fragment a has not been attached yet my.app.HostFragment.addFragment
主机 fragment 类:
fun addFragment(fragment: Fragment) {
childFragmentManager.beginTransaction()
.add(R.id.fragment_root_container, fragment)
.addToBackStack(null)
.commit()
}
主 Activity 类:
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
调用带有新 fragment 实例的 addFragment
(我不重复使用旧 fragment 的实例。)
哪个 fragment 没有附上?我的 HostFragment 或我要添加的新的。
最佳答案
您的应用程序崩溃是因为 FragmentStatePagerAdapter
的实现不正确。
// private var fragments: MutableList<Fragment> = mutableListOf() // <-- remove this line entirely
您不能在您的 Fragment*PagerAdapter
中保留一个 fragment 列表,因为系统会重新创建 fragment ,并且您将在该列表中调用永远不会真正添加到 FragmentManager。
你可以做的是将 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 .
关于android - fragment 尚未附加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58594982/