java .lang.IllegalStateException: уже добавленный фрагмент: Fragment1 with FragmentStatePagerAdapter - PullRequest
0 голосов
/ 08 апреля 2020

Я использовал FragmentStatePagerAdapter для Viewpager, и он работает нормально, если я устанавливаю адаптер перед вызовом API. Если через некоторое время я устанавливаю адаптер, я получаю исключение (я устанавливаю адаптер только один раз).

На самом деле я не знаю, какова точная проблема и решение.

Пожалуйста, проверьте приведенный ниже код для справки

Адаптер:

class MyPagerAdapter(
    private val context: Context,
    fm: FragmentManager,
    private val event: EventInfoResponse
) :
    FragmentPagerAdapter(fm,
        BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
    ) {
    private val fragmentsList = arrayListOf<Fragment>()
    val fragmentTitleList = arrayListOf<String>()


    override fun getItem(position: Int): Fragment {
        return when (position) {
            0 -> Fragment1.newInstance(event)
            else -> Fragment2.newInstance(event.id!!)
        }
    }

    override fun getCount(): Int {
        return 2
    }

    override fun getPageTitle(position: Int): CharSequence? {
        return when (position) {
            0 -> "title 1"
            else -> "title 2"
        }
    }
}

Применение адаптера:

 vpEvent.apply {
            adapter = MyPagerAdapter(requireContext(),childFragmentManager,event!!)
            tlEvent.setupWithViewPager(this)
        }

Исключение:

 java.lang.IllegalStateException: Fragment already added: Fragment1{9b6bafd (10e16e31-8262-4161-aeff-c78e1180030f) id=0x7f0a065f android:switcher:2131363423:0}
        at androidx.fragment.app.FragmentManagerImpl.addFragment(FragmentManagerImpl.java:1379)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:399)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1869)

1 Ответ

0 голосов
/ 08 апреля 2020

Проблема в том, что вы напрямую Fragment в Adapter. Вы должны создать экземпляр фрагмента снаружи от Adapter и внедрить в Adapter и с помощью метода getItem() ввести ‍‍‍‍‍‍‍created Fragment в Adapter.

...