web-dev-qa-db-fra.com

Le fragment n'existe plus pour la touche FragmentStaTeadapter avec ViewPager2

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.

9
Eren Tüfekçi

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

3
Gastón Saillén

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.

0
Eren Tüfekçi

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!!)
0
allanman