带有 Viewpager2 的键 FragmentStateAdapter 的片段不再存在
Fragment no longer exists for key FragmentStateAdapter with 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;
当我 return 包含嵌套片段的片段崩溃时
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 中的方法,所以实现这个解决方案是不可能的。
感谢您阅读本文。感谢任何帮助。
我的问题通过实施新的导航组件解决了。它本身处理片段转换。遇到此问题的任何人都可以更改他们的导航方法。
我刚遇到同样的问题。原因是当包含片段被重新创建时,它的 childFragmentManager 也是如此。 FragmentStateAdapter 在传递的 fragmentmanager 中查找它恢复状态的片段。
我的解决方案是让它使用 activity 的 fragmentManager 而不是片段的,例如使用采用 activity like
的构造函数
class MyAdapter(f: Fragment) : FragmentStateAdapter(f.activity!!)
将 viewpager2 与 FragmentStateAdapter
一起使用与 FragmentStatePagerAdapter
具有相似的行为
其实有两种方法可以解决这个问题
第一个是在我们的 viewpager2
中将 setSaveEnabled()
设置为 false
viewpager2.setSaveEnabled(false)
另一个在我们的适配器上覆盖 restoreState
和 return null
检查:https://developer.android.com/reference/androidx/viewpager2/adapter/FragmentStateAdapter
您所要做的就是在布局文件中使用以下内容设置您的 viewpager2 属性
android:saveEnabled="true"
尝试在 FragmentStateAdapter 中的片段参数中调用 requireActivity()
private inner class ScreenSlidePagerAdapter(fa: FavoriteFragment) : FragmentStateAdapter(fa.requireActivity())
我正在为我的项目使用 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;
当我 return 包含嵌套片段的片段崩溃时
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 中的方法,所以实现这个解决方案是不可能的。
感谢您阅读本文。感谢任何帮助。
我的问题通过实施新的导航组件解决了。它本身处理片段转换。遇到此问题的任何人都可以更改他们的导航方法。
我刚遇到同样的问题。原因是当包含片段被重新创建时,它的 childFragmentManager 也是如此。 FragmentStateAdapter 在传递的 fragmentmanager 中查找它恢复状态的片段。
我的解决方案是让它使用 activity 的 fragmentManager 而不是片段的,例如使用采用 activity like
的构造函数class MyAdapter(f: Fragment) : FragmentStateAdapter(f.activity!!)
将 viewpager2 与 FragmentStateAdapter
一起使用与 FragmentStatePagerAdapter
其实有两种方法可以解决这个问题
第一个是在我们的 viewpager2
中将setSaveEnabled()
设置为 false
viewpager2.setSaveEnabled(false)
另一个在我们的适配器上覆盖 restoreState
和 return null
检查:https://developer.android.com/reference/androidx/viewpager2/adapter/FragmentStateAdapter
您所要做的就是在布局文件中使用以下内容设置您的 viewpager2 属性
android:saveEnabled="true"
尝试在 FragmentStateAdapter 中的片段参数中调用 requireActivity()
private inner class ScreenSlidePagerAdapter(fa: FavoriteFragment) : FragmentStateAdapter(fa.requireActivity())