J'utilise ViewPager2 pour mon projet. J'ai besoin d'utiliser des fragments imbriqués dans un fragment avec ViewPager2. Cela fonctionne comme charme jusqu'à ce que j'essaie de naviguer entre des fragments (non imbriqués).
Après la première navigation entre fragments, l'application de l'application avec l'erreur expliquée ci-dessous.
le fragment contenant des fragments imbriqués surCréaView Méthode:
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;
Lorsque je retourne le fragment contenant des fragments imbriqués, il se bloque avec
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)
Il existe des solutions pour fragmentstatepageradapter, mais il n'y a pas de fragmentStateadapter. Et parce que je ne peux pas remplacer les méthodes de FragmentSteaTeadapter, mettre en œuvre ces solutions sont impossibles.
Merci d'avoir lu ceci. Toute aide est appréciée.
Utilisation de la fenêtrePager2 avec FragmentStateAdapter
a un comportement similaire à celui de FragmentStatePagerAdapter
En fait, il y a deux façons de résoudre ce problème
La première est la définition setSaveEnabled()
sur false dans notre visualPager2
viewpager2.setSaveEnabled(false)
L'autre est le remplacement restoreState
sur notre adaptateur et retourne null
Vérifiez: https://developer.android.com/reference/androidx/viewpager2/adapter/fragmentSteAteadapter
Mon problème résolu avec la mise en œuvre de nouveaux composants de navigation. Il gère lui-même la transition du fragment. Toute personne qui traverse ce problème peut changer sa méthode de navigation.
Je viens d'avoir le même problème. La cause est que lorsque le fragment contenant est recréé, il s'agit également de l'enfantfragmentManager. Et le fragmentStateadapter regarde dans le fragment de fragment réussi pour trouver des fragments qu'elle rétablit l'état pour.
Ma solution consistait à utiliser le fragmentManager de l'activité au lieu de la fragment, par exemple, utilisez le constructeur qui prend une activité comme
class MyAdapter(f: Fragment) : FragmentStateAdapter(f.activity!!)