本文介绍了带Viewpager2的键FragmentStateAdapter的片段不再存在的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我的项目使用ViewPager2.我需要在viewpager2片段中使用嵌套片段.直到我尝试在片段(而不是嵌套片段)之间导航之前,它都像魅力一样起作用.

I am using ViewPager2 for my project. I need to use nested fragments inside a fragment with viewpager2. it works like charm until I try to navigate between fragments(not nested ones).

第一次在片段之间导航后,应用程序崩溃,并显示以下错误.

After the first time navigating between fragments, the application crash with the error explained below.

包含嵌套片段OnCreateView方法的片段:

the fragment which contains nested fragments OnCreateView method:

View view = inflater.inflate(R.layout.orders_fragment, null);

ViewPager2 viewPager = view.findViewById(R.id.childViewPager);

TabLayout tabs = view.findViewById(R.id.tabs);

SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager(),getLifecycle());

viewPager.setAdapter(sectionsPagerAdapter);

TabLayoutMediator.TabConfigurationStrategy tabConfigurationStrategy = (tab, position) -> {

    String[] order_activity_tabs = getResources().getStringArray(R.array.situations);

    for (int i=0; i<order_activity_tabs.length; i++) {

        if(i==position)
            tab.setText(order_activity_tabs[i]);

    }
};

TabLayoutMediator tabLayoutMediator = new TabLayoutMediator(tabs, viewPager, tabConfigurationStrategy);
tabLayoutMediator.attach();

return view;

当我返回包含嵌套片段的片段时,它会崩溃

When I return the fragment that contains nested fragments it crashes with

 java.lang.IllegalStateException: Fragment no longer exists for key f#0: unique id 4fbe17b8-5e22-4e07-a543-4a79445ad39c
        at androidx.fragment.app.FragmentManagerImpl.getFragment(FragmentManagerImpl.java:365)
        at androidx.viewpager2.adapter.FragmentStateAdapter.restoreState(FragmentStateAdapter.java:549)
        at androidx.viewpager2.widget.ViewPager2.restorePendingState(ViewPager2.java:350)
        at androidx.viewpager2.widget.ViewPager2.dispatchRestoreInstanceState(ViewPager2.java:375)
        at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4045)
        at android.view.View.restoreHierarchyState(View.java:20253)
        at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:548)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:907)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2079)

对于FragmentStatePagerAdapter有解决方案,但对于FragmentStateAdapter没有解决方案.而且由于无法覆盖FragmentStateAdapter中的方法,因此无法实现此解决方案.

There are solutions for FragmentStatePagerAdapter but there is no for FragmentStateAdapter. And because I can't override methods in FragmentStateAdapter, implementing this solutions are impossible.

感谢您阅读本文.感谢您的帮助.

Thank you for reading this. Any help is appreciated.

推荐答案

将viewpager2与 FragmentStateAdapter 一起使用的行为与 FragmentStatePagerAdapter

Using viewpager2 with FragmentStateAdapter has a similar behaviour than FragmentStatePagerAdapter

实际上,有两种方法可以解决此问题

Actually there are two ways of solving this problem

第一个是将 setSaveEnabled()设置为false进入我们的viewpager2

First one is seting setSaveEnabled() to false into our viewpager2

viewpager2.setSaveEnabled(false)

另一个是在我们的适配器上覆盖 restoreState 并返回null

The other one is overriding restoreState at our adapter and return null

检查: https://developer.android.com/reference/androidx/viewpager2/adapter/FragmentStateAdapter

这篇关于带Viewpager2的键FragmentStateAdapter的片段不再存在的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-10 02:53