Come ottengo il frammento attualmente visualizzato?


448

Sto giocando con frammenti in Android.

So che posso cambiare un frammento usando il seguente codice:

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();

La mia domanda è, in un file Java, come posso ottenere l'istanza Fragment attualmente visualizzata?



Risposte:


454

Quando aggiungi il frammento nella tua transazione, dovresti usare un tag.

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

... e successivamente se si desidera verificare se il frammento è visibile:

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

Vedi anche http://developer.android.com/reference/android/app/Fragment.html


74
Ok, ma ho bisogno di un modo per ottenere immediatamente l'istanza del frammento attualmente visualizzata, non controllare iterativamente tutti i frammenti e quindi decidere quale frammento è ora visualizzato sullo schermo. Penso che la tua risposta abbia bisogno del mio codice per controllare iterativamente ciascuno dei miei frammenti e scoprire quello visibile ...
Leem.fin,

33
Sì, ma potrebbe essere visibile più di un frammento alla volta. Quindi non c'è niente come l '"unico frammento attivo" ....
ramdroid,

6
Ok, anche se ci sono diversi frammenti visualizzati, ho ancora bisogno di un modo per ottenerli ... e un modo che è meglio che controllare ripetutamente ciascuno dei miei frammenti. Sono preoccupato di "ottenerli" un metodo come getDisplayedFragment (), ma non sono sicuro che esista tale metodo in Android
Leem.fin,

2
Non so perché questo sia un problema per te ... Di solito hai solo pochi frammenti in un'attività e non dovrebbe davvero essere un problema controllarli se sono visibili o meno.
Ramdroid,

13
Perché tutti stanno votando questa risposta? Certo, è un bel po 'di codice ma non risponde alla domanda per ottenere un frammento specifico per tag. MA Asker vuole il frammento attualmente visualizzato, il che significa che non sa quale frammento viene visualizzato. Sì, potrebbero esserci più frammenti, ma leggendo la domanda viene visualizzato solo 1 frammento viene visualizzato sull'interfaccia utente .... Siamo spiacenti, ho dovuto effettuare il downgrade perché non risponde al contesto della domanda.
angryITguy,

411

So che è un vecchio post, ma in precedenza ho avuto problemi con esso. Ho trovato una soluzione per farlo nella onBackStackChanged()funzione di ascolto

  @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();

    }

Questo ha funzionato per me poiché non volevo scorrere tutti i frammenti che devo trovare uno visibile. Spero che aiuti anche qualcun altro.


13
Esattamente quello che stavo cercando quando ho a che fare con onBackPressed () dopo la rotazione dello schermo con un cassetto di navigazione. Grazie per essere tornato a condividere questo.
ShortFuse

1
FindFragmentById non scorre all'interno di tutti i frammenti? :)
Andrew Senner,

46
nel caso in cui .getFragmentManagerriporta un tipo incompatibile, come nel mio caso, è perché stavo usando il android.support.app.v4.Fragment, nel qual caso il metodo giusto da usare ègetSupportFragmentManager
Răzvan Barbu,

3
oppure puoi utilizzare findFragmentByTag()al posto di findFragmentById, se hai fornito tag da frammentare quando lo aggiungi afragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
DeltaCap019

@AndrewSenner, significa che non voleva farlo esplicitamente :)
Farid

161

Ecco la mia soluzione che trovo utile per scenari con frammenti bassi

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;
}

13
fragmentpuò essere nullo in alcuni scenari, ad esempio quando si popola lo stack posteriore. Quindi un uso migliore if (fragment != null && fragment.isVisible()).
cprcrack,

8
metodo incompleto perché è possibile che non siano visibili solo un frammento
letroll

Se non è visibile alcun frammento, fragmentManager.getFragments () restituirà NULL che porterà a NPE che dice "Tentativo di invocare il metodo di interfaccia 'java.util.Iterator java.util.List.iterator ()' su un riferimento a oggetto NULL". Pertanto, il ciclo for dovrebbe essere circondato da un semplice controllo: if (fragments! = Null)
Pranav Mahajan

Cosa succede se sono visibili più frammenti?
Shivaraj Patil,

5
Tecnicamente questo dovrebbe essere contrassegnato come risposta in base alla domanda. Asker vuole il frammento attualmente visualizzato, non sapendo di quale frammento si tratti. Altre risposte continuano a ricevere frammenti per tag
angryITguy

76

Ogni volta che mostri un frammento devi metterlo nel backstack:

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

E quindi quando è necessario ottenere il frammento corrente è possibile utilizzare questo metodo:

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

4
Sono abbastanza sicuro che questa tecnica non funzionerà con i frammenti usati con un ViewPager, poiché non sono aggiunti per tag. Lo sto solo lanciando.
Loeschg,

3
Questo sembra funzionare solo quando chiami addToBackStack(tag), ma cosa succede se non vuoi aggiungere il frammento allo stack posteriore?
cprcrack,

1
Funziona solo se il tag è identico al nome dello stack posteriore, il che sembra insolito.

Cosa succede se hai aggiunto 5 frammenti nella stessa transazione?
Kevin Lam,

Forse è bello dire che se si chiama addToBackStack (null) per alcuni frammenti in cui non è necessario un nome, il metodo getName () può restituire null e si ottiene un NPE. @ dpk, docu dice: Ottieni il nome che è stato fornito a FragmentTransaction.addToBackStack (String) durante la creazione di questa voce. Inoltre, aggiungere un controllo null se EntryCount è 0 e si tenta di ricevere la voce principale.
JacksOnF1re

23

Quello che sto usando per trovare il frammento di visualizzazione corrente è nel codice seguente. È semplice e funziona per me ormai. Funziona nell'attività che contiene i frammenti

    FragmentManager fragManager = this.getSupportFragmentManager();
    int count = this.getSupportFragmentManager().getBackStackEntryCount();
    Fragment frag = fragManager.getFragments().get(count>0?count-1:count);

3
Dovresti controllare per essere sicuro di contare> 0 in modo che get (count-1) non generi IndexOutofBoundsException
kehers,

@tainy questo non darà il frammento che è stato sostituito ma non aggiunto al backstack. Diritto? Se sì, allora posso ottenerlo usando l'argomento tag?
cafebabe1991,

La chiamata getFragments non ti darà i frammenti nell'ordine in cui sono stati aggiunti dopo aver chiamato popBackStack (null, FragmentManager.POP_BACK_STACK_INCLUSIVE) su di esso e aggiungere altri frammenti.
LEHO,

se l'attività ha più di un frammento visibile, la tua strada è sbagliata. Ad esempio: ViewPager con frammenti. come ho conosciuto getBackStackEntryCount () restituisce il numero di Transazione, non il numero di frammento
HungNM2

Dovresti controllare fragManager.getFragments().size()invece getBackStackEntryCount()che non sono necessariamente uguali (che è il mio caso). Altrimenti puoi andare in crash con IndexOutOfBoundsException
RustamG

20

Via di Kotlin;

val currentFragment = supportFragmentManager.fragments.last()

Funziona solo su API 26 e successive
ibit

1
@ibit cosa intendi con opere su API 26 e successive? Ho provato a far funzionare bene l'emulatore API 19.
HendraWD,

@HendraWD hai ragione! Mi riferivo alla funzione nella funzione frameworks getFragments(), che è API 26 e successive.
ibit

2
stai attento. Se prima non hai stack di frammenti, può causare un'eccezione vuota!
Jetwiz,

Questo non funziona? java.lang.ClassCastException: androidx.navigation.fragment.NavHostFragment non può essere lanciato su Fragment
coolcool1994

13

Il modo reattivo :

Observable.from(getSupportFragmentManager().getFragments())
    .filter(fragment -> fragment.isVisible())
    .subscribe(fragment1 -> {
        // Do something with it
    }, throwable1 -> {
        // 
    });

7
come è reattivo? Usi un osservabile ma emetterà una sola volta
Tim

6
Ed è solo un eccesso. Un semplice forloop migliorato farebbe lo stesso, forse anche più veloce.
Peterstev Uremgba,

usare il flusso reattivo per il solo flusso di API non è così intelligente, in realtà come hanno detto che è un eccessivo uso dell'API Java8 di vapore se vuoi trattare l'elenco come un flusso e applicare il filtro api
AndroidLover

13

Il mio metodo si basa su try / catch in questo modo:

MyFragment viewer = null;
    if(getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT) instanceOf MyFragment){
    viewer = (MyFragment) getFragmentManager().findFragmentByTag(MY_TAG_FRAGMENT);
}

Ma potrebbe esserci un modo migliore ...


1
La mia domanda è come ottenere frammenti attualmente visualizzati, il che significa che potrebbero esserci molti frammenti, voglio solo ottenere l'istanza di quello attualmente visualizzato, perché usare (MyFragment) ?? Voglio dire che potrebbe essere qualsiasi frammento visualizzato sullo schermo ... e voglio ottenere quello attualmente visualizzato.
Leem.fin,

MY_TAG_FRAGMENT è il tag del frammento che ho creato prima di utilizzare un sostituto, come questo: fragmentTransaction.replace (R.id.FL_MyFragment, MyFragment, MY_TAG_FRAGMENT);
Thordax,

Se ho più frammenti, posso usare un tag per tutti i frammenti quando chiamo .replace (...)?
Leem.fin,

Sì, nessun problema, utilizzare questo codice: fragmentTransaction.replace (R.id.FL_MyFragment, MyFragment, MY_TAG_FRAGMENT); e potrebbe andare bene.
Thordax,

1
Bene, davvero non capisco, intendo che ho bisogno di un modo per ottenere immediatamente l'istanza del frammento attualmente visualizzata, non controllare iterativamente tutti i frammenti e quindi decidere quale frammento è ora visualizzato sullo schermo.
Leem.fin,

11

Bene, questa domanda ha avuto molti punti di vista e attenzione ma non conteneva ancora la soluzione più semplice da parte mia: usare getFragments ().

            List fragments = getSupportFragmentManager().getFragments();
            mCurrentFragment = fragments.get(fragments.size() - 1);

1
Sfortunatamente, questo non è sempre vero, getSupportFragmentManager().getFragments() ti restituisce un elenco ma che può contenere valori null, se l'ultimo frammento è stato appena estratto dallo backstack. Eq: Se controlli all'interno del onBackStackChanged()metodo e chiami popBackStack()da qualche parte, allora lo mCurrentFragmentsarà null.
Stumi,

@Stumi Grazie per queste informazioni. Sì, sembra uno dei tanti strani problemi del ciclo di vita in Android.
Nativ,

9

È possibile eseguire una query su quale frammento viene caricato nel riquadro del contenuto delle attività e recuperare la classe del frammento o il frammento "nome semplice" (come stringa).

public String getCurrentFragment(){
     return activity.getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();
}

Uso:

Log.d(TAG, getCurrentFragment());

Uscite:

D/MainActivity: FragOne

8

È un po 'tardi, ma per chiunque sia interessato: se si conosce l'indice del frammento desiderato in FragmentManager, basta ottenere un riferimento ad esso e verificare la funzione isMenuVisible ()! Qui :

getSupportFragmentManager().getFragments().get(0).isMenuVisible()

Se è truevisibile all'utente e così via!


1
Stranamente, questa era l'unica soluzione elencata qui che ha funzionato per me. Allo stesso tempo, più frammenti possono avere isVisible() == true, getView() != null. Inoltre, nel mio codice getBackStackEntryCountè sempre zero. Anche se non uso i menu, isMenuVisible()finora è l'unico discriminante che sembra puntare in modo affidabile al frammento attualmente "attivo". ty
parvus

7

1)

ft.replace(R.id.content_frame, fragment, **tag**).commit();

2)

FragmentManager fragmentManager = getSupportFragmentManager();
Fragment currentFragment = fragmentManager.findFragmentById(R.id.content_frame);

3)

if (currentFragment.getTag().equals(**"Fragment_Main"**))
{
 //Do something
}
else
if (currentFragment.getTag().equals(**"Fragment_DM"**))
{
//Do something
}

6

Se arriva qui e stai usando Kotlin:

var fragment = supportFragmentManager.findFragmentById(R.id.fragment_container)

R.id.fragment_containerè il luogo in idcui si fragmentsta presentandoactivity

O se vuoi una soluzione migliore:

supportFragmentManager.findFragmentById(R.id.content_main)?.let {
    // the fragment exists

    if (it is FooFragment) {
        // The presented fragment is FooFragment type
    }
}

5

Ispirato dalla risposta di Tainy , ecco i miei due centesimi. Poco modificato dalla maggior parte delle altre implementazioni.

private Fragment getCurrentFragment() {
    FragmentManager fragmentManager = myActivity.getSupportFragmentManager();
    int stackCount = fragmentManager.getBackStackEntryCount();
    if( fragmentManager.getFragments() != null ) return fragmentManager.getFragments().get( stackCount > 0 ? stackCount-1 : stackCount );
    else return null;
}

Sostituisci "myActivity"con "questo" se è la tua attività corrente o usa il riferimento alla tua attività.


5

C'è un metodo chiamato findFragmentById()in SupportFragmentManager. Lo uso nel contenitore delle attività come:

public Fragment currentFragment(){
    return getSupportFragmentManager().findFragmentById(R.id.activity_newsfeed_frame);
}

Ecco come ottenere la tua corrente Fragment. Se hai personalizzato Fragmente devi controllare di cosa Fragmentsi tratta, normalmente utilizzo instanceof:

if (currentFragment() instanceof MyFrag){
    // Do something here
}


4

Questo è un modo semplice per ottenere il frammento corrente.

getFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
  @Override public void onBackStackChanged() {
    currentFragment = fragmentManager.findFragmentById(R.id.content);
    if (currentFragment !=  null && (currentFragment instanceof LoginScreenFragment)) {
      logout.setVisibility(View.GONE);
    } else {
      logout.setVisibility(View.VISIBLE);
    }
  }
});

4

La risposta di Sev funziona quando si preme il pulsante Indietro o in caso contrario si cambia lo zaino.

Ho fatto qualcosa di leggermente diverso, però. Ho una configurazione dell'ascoltatore di modifiche di backstack su un frammento di base e sui suoi frammenti derivati ​​e questo codice è nell'ascoltatore:

Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.container);

if (f.getClass().equals(getClass())) {
    // On back button, or popBackStack(),
    // the fragment that's becoming visible executes here,
    // but not the one being popped, or others on the back stack

    // So, for my case, I can change action bar bg color per fragment
}

3

Questo è lavoro per me. Spero che questo possa aiutare qualcuno.

FragmentManager fragmentManager = this.getSupportFragmentManager();  
        String tag = fragmentManager
                    .getBackStackEntryAt(
                    fragmentManager
                    .getBackStackEntryCount() - 1)
                    .getName();
              Log.d("This is your Top Fragment name: ", ""+tag);

3

Se stai ricevendo l'istanza corrente di Frammento dall'attività principale puoi semplicemente

findFragmentByID(R.id.container);

Questo effettivamente ottiene l'attuale istanza di frammento popolata nella vista. Ho avuto lo stesso problema. Ho dovuto caricare due volte lo stesso frammento tenendone uno nello zaino.

Il seguente metodo non funziona. Ottiene solo un frammento che ha il tag. Non perdere tempo con questo metodo. Sono sicuro che ha i suoi usi, ma per ottenere la versione più recente dello stesso frammento non è uno di questi.

findFragmentByTag()

3

Dai un'occhiata a questa soluzione. Ha funzionato per me ottenere l'attuale frammento.

if(getSupportFragmentManager().getBackStackEntryCount() > 0){
        android.support.v4.app.Fragment f = 
         getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        if(f instanceof ProfileFragment){
            Log.d(TAG, "Profile Fragment");
        }else if(f instanceof SavedLocationsFragment){
            Log.d(TAG, "SavedLocations Fragment");
        }else if(f instanceof AddLocationFragment){
            Log.d(TAG, "Add Locations Fragment");
        }

2
final FragmentManager fm=this.getSupportFragmentManager();
final Fragment fragment=fm.findFragmentByTag("MY_FRAGMENT");

if(fragment != null && fragment.isVisible()){
      Log.i("TAG","my fragment is visible");
}
else{
      Log.i("TAG","my fragment is not visible");
}

Questo funziona con Jetpack?
IgorGanapolsky,

2
getSupportFragmentManager().findFragmentById(R.id.content_frame).getClass().getSimpleName();

Bene, immagino che questa sia la risposta più diretta a questa domanda. Spero che questo possa essere d'aiuto.


2

Ecco una soluzione Kotlin:

if ( this.getSupportFragmentManager().getBackStackEntryCount()>0 ) {
    var fgmt = this.getSupportFragmentManager().fragments[this.getSupportFragmentManager().getBackStackEntryCount()-1]
    if( fgmt is FgmtClassName ) {
        (fgmt as FgmtClassName).doSth()
    }
}

Modo semplificato:

with ( this.getSupportFragmentManager() ) {
    if ( getBackStackEntryCount()>0 ) {
        var fgmt = fragments[getBackStackEntryCount()-1]
        if ( fgmt is FgmtClassName ) {
            (fgmt as FgmtClassName).doSth()
        }
    }
}

2

Un modo semplice per farlo:

Fragment fr=getSupportFragmentManager().findFragmentById(R.id.fragment_container);
String fragmentName = fr.getClass().getSimpleName();

1

Nell'attività principale, il metodo onAttachFragment (Fragment fragment) viene chiamato quando un nuovo frammento è collegato all'attività. In questo metodo, è possibile ottenere l'istanza del frammento corrente. Tuttavia, il metodo onAttachFragment non viene chiamato quando un frammento viene estratto dallo backstack, ovvero quando viene premuto il pulsante Indietro per ottenere il frammento superiore in cima allo stack. Sto ancora cercando un metodo di callback che viene attivato nell'attività principale quando un frammento diventa visibile all'interno dell'attività.


così così vicino! :-)
Blundell,

Usiamo la libreria di navigazione Jetpack
IgorGanapolsky il

1

In caso di frammenti di scorrimento, quando l'istanza di utilizzo della classe ViewPager, supponiamo mVeiwPager, puoi chiamare mViewPager.getCurrentItem () per ottenere il numero int del frammento corrente.

in MainLayout.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:orientation="vertical"
    tools:context="unidesign.photo360.MainActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="false"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:expanded="false">

        <android.support.v7.widget.Toolbar
            android:id="@+id/main_activity_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            app:title="@string/app_name">

        </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>


    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </android.support.v4.view.ViewPager>
    
</android.support.design.widget.CoordinatorLayout>

in MainActivity.kt

class MainActivity : AppCompatActivity() {
    
        lateinit var mViewPager: ViewPager
        lateinit var pageAdapter: PageAdapter
        
//      ...
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            
            pageAdapter = PageAdapter(supportFragmentManager)
            mViewPager = findViewById(R.id.view_pager)
//          ...
            }
            
        override fun onResume() {
          super.onResume()
          var currentFragment = pageAdapter.getItem(mViewPager.currentItem)
//         ...
          }


1

Ho scoperto findFragmentByTagche non è conveniente. Se hai String currentFragmentTagnel tuo Activityo genitore Fragment, è necessario salvarlo onSaveInstanceStatee ripristinarlo onCreate. Anche se si fa così, quando la Activityricreato, onAttachFragmentsarà chiamato prima onCreate, quindi non è possibile utilizzare currentFragmentTagin onAttachFragment(ad es. Aggiornare alcune opinioni sulla base dicurrentFragmentTag ), perché di forze non ancora ripristinata.

Io uso il seguente codice:

Fragment getCurrentFragment() {
    List<Fragment> fragments = getSupportFragmentManager().getFragments();
    if(fragments.isEmpty()) {
        return null;
    }
    return fragments.get(fragments.size()-1);
}

Il documento FragmentManagerafferma che

L'ordine dei frammenti nell'elenco è l'ordine in cui sono stati aggiunti o allegati.

Quando devi fare cose in base al tipo di frammento corrente, usa getCurrentFragment() instance of MyFragmentinvece dicurrentFragmentTag.equals("my_fragment_tag") .

Si noti che getCurrentFragment()in onAttachFragmentnon verrà allegato Fragment, ma il precedente allegato.


1

Ho dovuto farlo molto di recente e nessuna delle risposte qui si adattava davvero a questo scenario.

Se sei sicuro che sarà visibile solo un frammento (schermo intero), quindi vuoi davvero trovare ciò che si trova nella parte superiore dello zaino. Ad esempio, come Kotlinper Fragment:

import androidx.fragment.app.Fragment

fun Fragment.setVisibilityChangeListener(clazz: Class<out Fragment>, listener: (Boolean) -> Unit) {
    fragmentManager?.run {
        addOnBackStackChangedListener {
            val topFragmentTag = getBackStackEntryAt(backStackEntryCount - 1).name
            val topFragment = findFragmentByTag(topFragmentTag)
            listener(topFragment != null && topFragment::class.java == clazz)
        }
    }
}

E usalo come:

class MyFragment: Fragment {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        setVisibilityChangeListener(this::class.java) { visible -> 
            // Do stuff
        }
    }
}

1

Puoi farlo molto facilmente anche con un URL in logcat che ti reindirizzerà al codice sorgente del codice sorgente del frammento corrente. Innanzitutto, devi aggiungere un OnBackStackChangedListener nell'attività dell'host come -

activity.getChildFragmentManager().addOnBackStackChangedListener(backStackListener);

E l' implementazione di OnBackStackChangedListener è -

    public FragmentManager.OnBackStackChangedListener backStackListener = () -> {

    String simpleName = "";
    String stackName = getStackTopName().trim();

    if (Validator.isValid(stackName) && stackName.length() > 0) {

      simpleName = stackName.substring(Objects.requireNonNull(stackName).lastIndexOf('.') + 1).trim();

      List<Fragment >
       fragmentList = getChildFragmentManager().getFragments();
      Fragment myCurrentFragment;

      for (int i = 0; i < fragmentList.size(); i++) {
       myCurrentFragment= fragmentList.get(i);
       if (myCurrentFragment.getClass().getSimpleName().equals(simpleName)) {
        //Now you get the current displaying fragment assigned in myCurrentFragment.
        break;
       }
       myFragment = null;
      }
     }


     //The code below is for the source code redirectable logcat which would be optional for you.
     StackTraceElement stackTraceElement = new StackTraceElement(simpleName, "", simpleName + ".java", 50);
     String fileName = stackTraceElement.getFileName();
     if (fileName == null) fileName = "";
     final String info = "Current Fragment is:" + "(" + fileName + ":" +
     stackTraceElement.getLineNumber() + ")";
     Log.d("now", info + "\n\n");
    };

E il metodo getStackTopName () è -

public String getStackTopName() {
    FragmentManager.BackStackEntry backEntry = null;
    FragmentManager fragmentManager = getChildFragmentManager();
    if (fragmentManager != null) {
        if (getChildFragmentManager().getBackStackEntryCount() > 0)
            backEntry = getChildFragmentManager().getBackStackEntryAt(
                    getChildFragmentManager().getBackStackEntryCount() - 1
            );
    }
    return backEntry != null ? backEntry.getName() : null;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.