带Viewpager2的键FragmentStateAdapter的片段不再存在

时间:2019-12-26 09:38:41

标签: android android-fragments android-adapter fragmentstatepageradapter android-viewpager2

我正在为我的项目使用ViewPager2。我需要在viewpager2片段中使用嵌套片段。就像魅力一样,直到我第一次尝试在片段(而不是嵌套片段)之间导航。

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

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;

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

 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中的方法,因此无法实现此解决方案。

感谢您阅读本文。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:14)

FragmentStateAdapter一起使用viewpager2的行为与FragmentStatePagerAdapter相似

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

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

viewpager2.setSaveEnabled(false)

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

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

答案 1 :(得分:0)

通过实现用于片段过渡处理的新导航组件解决了问题。遇到此问题的任何人都可以更改其导航方法。

答案 2 :(得分:0)

您所要做的就是使用以下属性在布局文件中设置 viewpager2

android:saveEnabled="true"

答案 3 :(得分:0)

尝试在 FragmentStateAdapter 内的片段参数中调用 requireActivity()

private inner class ScreenSlidePagerAdapter(fa: FavoriteFragment) : FragmentStateAdapter(fa.requireActivity())