540 Stimmen

Wie erhalte ich das aktuell angezeigte Fragment?

Ich spiele mit Fragmenten in Android.

Ich weiß, dass ich ein Fragment mit Hilfe des folgenden Codes ändern kann:

FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();

MyFragment myFragment = new MyFragment(); //my custom fragment

fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();

Meine Frage ist, wie kann ich in einer Java-Datei die aktuell angezeigte Fragment-Instanz erhalten?

0 Stimmen

1 Stimmen

Mögliches Duplikat von Abrufen des aktuellen Fragmentobjekts

510voto

ramdroid Punkte 6598

Wenn Sie das Fragment in Ihrer Transaktion hinzufügen, sollten Sie ein Tag verwenden.

fragTrans.replace(android.R.id.content, myFragment, "MY_FRAGMENT");

...und später, wenn Sie prüfen wollen, ob das Fragment sichtbar ist:

MyFragment myFragment = (MyFragment)getSupportFragmentManager().findFragmentByTag("MY_FRAGMENT");
if (myFragment != null && myFragment.isVisible()) {
   // add your code here
}

Siehe auch http://developer.Android.com/reference/Android/app/Fragment.html

455voto

Sev Punkte 4718

Ich weiß, dass der Beitrag schon alt ist, aber ich hatte früher auch Probleme damit. Ich habe eine Lösung gefunden, die darin bestand, dies in der onBackStackChanged() Mithörfunktion

  @Override
    public void onBackPressed() {
        super.onBackPressed();

         Fragment f = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
      if(f instanceof CustomFragmentClass) 
        // do something with f
        ((CustomFragmentClass) f).doSomething();

    }

Das hat bei mir funktioniert, da ich nicht jedes Fragment durchgehen wollte, um eines zu finden, das sichtbar ist.

184voto

Matt Mombrea Punkte 6693

Hier ist meine Lösung, die ich für Szenarien mit wenig Fragmenten praktisch finde

public Fragment getVisibleFragment(){
    FragmentManager fragmentManager = MainActivity.this.getSupportFragmentManager();
    List<Fragment> fragments = fragmentManager.getFragments();
    if(fragments != null){
        for(Fragment fragment : fragments){
            if(fragment != null && fragment.isVisible())
                return fragment;
        }
    }
    return null;
}

83voto

Dmitry_L Punkte 1004

Jedes Mal, wenn Sie Fragment zeigen, müssen Sie es Tag in Backstack setzen:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);       
ft.add(R.id.primaryLayout, fragment, tag);
ft.addToBackStack(tag);
ft.commit();        

Wenn Sie dann das aktuelle Fragment abrufen müssen, können Sie diese Methode verwenden:

public BaseFragment getActiveFragment() {
    if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
        return null;
    }
    String tag = getSupportFragmentManager().getBackStackEntryAt(getSupportFragmentManager().getBackStackEntryCount() - 1).getName();
    return (BaseFragment) getSupportFragmentManager().findFragmentByTag(tag);
}

41voto

Cafer Mert Ceyhan Punkte 1312

Kotlin Weg;

val currentFragment = supportFragmentManager.fragments.last()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X