Фрагмент еще не был прикреплен - PullRequest
1 голос
/ 28 октября 2019

После прочтения постов об этом исключении я не могу понять, что мне нужно сделать, чтобы исправить эту ошибку. Кроме того, я даже не могу воспроизвести его ... Это иногда случается на некоторых устройствах, но я не понимаю, как ...

мои журналы:

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()
    }
}

Я всегда вызываю addFragment из моего MainActivity с новым экземпляром фрагмента (яне используйте экземпляр старых фрагментов повторно.)

Какой фрагмент не был прикреплен? Мой HostFragment или новый, который я пытаюсь добавить.

1 Ответ

1 голос
/ 29 октября 2019

Ваше приложение вылетает из-за неправильной реализации FragmentStatePagerAdapter.

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

Вы не должны хранить список фрагментов в вашем Fragment*PagerAdapter, потому что система воссоздаетфрагменты, и тот, который будет вызываться в этом списке, фактически никогда не будет добавлен в FragmentManager.

Что вы можете сделать, это переключить FragmentStatePagerAdapter на FragmentPagerAdapter, затемвы можете применить сбой приложения после того, как активность была убита в фоновом режиме и Как получить элементы фрагментов, созданных ViewPager в MainActivity? .

Чтобы воспроизвести ваш сбой, обратитесь к Объект Singleton становится нулевым после возобновления работы приложения .

...