web-dev-qa-db-de.com

FragmentPagerAdapter getItem wird nicht ausgelöst

Derzeit ändere ich mit einer FragmentActivity zwischen zwei Arten von Fragmenten, indem ich den folgenden Code verwende.

private void toggle() {
    Fragment oldFragment = getSupportFragmentManager().findFragmentById(R.id.content);
    Fragment fragment = null;
    if (oldFragment instanceof ColorFragment) {
        fragment = new ViewPagerFragment();
    } else {
        fragment = new ColorFragment(Android.R.color.black);
    }

    getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss();
}

2 Fragmente werden umgeschaltet.

  • ColorFragment - Ein einfaches Fragment, das den Hintergrund mit durchgehend schwarzer Farbe ausfüllt.
  • ViewPagerFragment - Ein Fragment enthält ViewPager. Der Benutzer kann zwischen einem violetten Farbfragment und einem blauen Farbfragment streichen.

Der Code, der für das Streichen von violetten und blauen Farbfragmenten verantwortlich ist, ist wie folgt.

private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new ColorFragment(Android.R.color.holo_purple);
        default:
            return new ColorFragment(Android.R.color.holo_blue_bright);
        }
    }      
} 

Ich stoße jedoch beim Umschalten auf das seltsame Verhalten.

  1. Schwarzes Farbfragment wurde gezeigt.
  2. Umschalten.
  3. Pager anzeigen, der zwischen den angezeigten violetten und blauen Fragmenten wischen kann.
  4. Umschalten.
  5. Schwarzes Farbfragment wurde gezeigt.
  6. Umschalten.
  7. Nichts wird angezeigt, da das getItem von MyFragmentPagerAdapter nicht ausgelöst wird.

Ich denke, meine Situation ist ähnlich wie FragmentPagerAdapter getItem heißt nicht

Ich ziehe es jedoch vor, FragmentStatePagerAdapter nicht zu verwenden, da die Kosten für möglicherweise mehr Aufwand beim Wechseln zwischen Seiten sind.

Gibt es eine Problemumgehung, um dieses Problem zu lösen?

Ich füge einen vollständigen funktionsfähigen Quellcode hinzu, um dieses Problem zu demonstrieren: https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.Zip

35
Cheok Yan Cheng

Gibt es eine Problemumgehung, um dieses Problem zu lösen?

Ich habe Ihren Code heruntergeladen, und das Problem wird angezeigt, weil Sie diese Fragments-Rechte nicht verwenden. Am genauesten verwenden Sie verschachtelte Fragments in der ViewPager-basierten Fragment und für diese ViewPager erstellen Sie den Adapter folgendermaßen:

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getFragmentManager());

Stattdessen sollten Sie getChildFragmentManager() verwenden, um die verschachtelten Fragmente zu binden:

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

Sie sollten auch keine Daten durch einen Konstruktor an eine Fragment übergeben, da diese Daten eine Konfigurationsänderung nicht überstehen und schlechte Dinge angezeigt werden. Verwenden Sie stattdessen eine Bundle.

107
Luksprog

Globale getestete Lösung.

getSupportFragmentManager() behält die Nullreferenz einige Male bei, und der View-Pager erstellt keine neue Fragmentinstanz. Um dieses Problem zu lösen, löst getChildFragmentManager() das Problem auf einfache Weise.

Nicht  

new PagerAdapter(getSupportFragmentManager(), fragments);

Tun

new PagerAdapter(getChildFragmentManager() , fragments);

12
Vinayak

In meinem Fall habe ich richtig angerufen

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

aber dann versuchte ich im verschachtelten Fragment das Containerfragment durch ein anderes zu ersetzen, indem

getFragmentManager()

Sie müssen zur Aktivität gehen und anrufen

getActivity().getSupportFragmentManager();
1
kingston

In meinen Fällen klappte es nach dem Hinzufügen zu meinem FragmentPagerAdapter :

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

und ich habe auch getChildFragmentManager () wie Luksprog gesagt hat

0
Jorge Casariego

Einfache Verwendung FragmentStatePagerAdapter anstelle von FragmentPagerAdapter

oder

sie können new MyFragmentPagerAdapter(this.getChildFragmentManager()) verwenden

Hoffe es wird dir helfen :)

0
Neo