2012-12-20 9 views
12
private static void changeFragment(Fragment f, boolean init) { 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.replace(R.id.info_content, f,f.getClass().getName()); 
     if(!init){ 
      ft.addToBackStack(null); 
     } 
     ft.commit(); 
    } 

quando voglio ottenere lo stack cout chiamando fm.getBackStackEntryCount(), restituisce zero?Perché GetBackStackEntryCount() di FragmentManager restituisce zero?

+0

qual è il valore di init bool? – Arvis

+0

qualunque sia vero o falso, è sempre zero. – beiliubei

risposta

27

È necessario chiamare un fm.executePendingTransactions() dopo il ft.commit() o prima di fm.getBackStackEntryCount(). Poiché commit() pianifica solo le transazioni per un passaggio successivo.

+3

So che questa risposta proviene da 2 anni fa ma sto riscontrando problemi simili e chiamando 'getSupportFragmentManager(). ExecutePendingTransactions();' dopo il commit non è stato risolto il problema. Puoi suggerire altre modifiche? –

+0

Quando executePendingTransactions() viene chiamato dopo commit(), viene generata un'eccezione. Se chiamato prima del getBackStackEntryCount(), il conteggio è ancora zero. –

5

Potrebbe essere troppo tardi per rispondere a questa domanda. Spero che questa risposta aiuti comunque qualcuno.

Principalmente dipende da dove si sta chiamando il metodo getBackStackEntryCount(). Nel mio caso, stavo chiamando questo metodo dopo aver chiamato super.onBackPressed(). Nel momento in cui questo metodo è stato chiamato, non c'era alcun frammento nel back stack. È per questo che mi è stato sempre ricevendo 0.

giusto modo di chiamare il metodo in onBackPressed():

@Override 
public void onBackPressed() { 
    try { 
     int backStackEntryCount = getSupportFragmentManager().getBackStackEntryCount(); 
     Log.d("class", "items in backstack " + backStackEntryCount); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    super.onBackPressed(); 
} 
+0

Questo ha risolto il mio problema, grazie! – Ethan

2

Un'altra soluzione sta usando FragmentManager.OnBackStackChangedListener

fm.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 
      Log.d("test", "backStackEntryCount: " + fm.getBackStackEntryCount()); 
     } 
}); 
17

Ho avuto un problema simile, a mio caso getFragmentManager(). getBackStackEntryCount() restituiva sempre zero.

Il mio problema era che ho utilizzando frammenti di supporto:

Fragment fragment = new MyFragment(); 
// note getSupportFragmentManager() instead getFragmentManager() 
FragmentManager fragmentManager = getSupportFragmentManager(); 
fragmentManager.beginTransaction() 
.replace(R.id.frame, fragment) 
.addToBackStack(null) 
.commit(); 

fragmentManager.executePendingTransactions(); 

e ho il controllo getFragmentManager() backStackEntryCount, che restituisce sempre zero (che sta utilizzando un altro gestore frammento):

@Override 
public void onBackPressed() { 
    if (getFragmentManager().getBackStackEntryCount() > 0) { 
     getFragmentManager().popBackStack();    
    } 
} 

anziché getSupportFragmentManager, che restituisce il numero corretto:

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     getSupportFragmentManager().popBackStack();   
    } 
} 

Spero che sia d'aiuto!

+2

Omg, questa è una fonte di potenziali bug per tutti gli sviluppatori. Grazie uomo. –

1

Potrebbe essere troppo tardi per rispondere a questa domanda. Spero che questa risposta aiuti comunque qualcuno.

È necessario il metodo getBackStackEntryCount() in onResume().

Sarà questo:

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.i(TAG, "onResume: " + fragmentManager.getBackStackEntryCount()); 
    for (int entry = 0; entry < fragmentManager.getBackStackEntryCount(); entry++) { 
     Log.i(TAG, "Found fragment: " + fragmentManager.getBackStackEntryAt(entry).getId()); 
    } 
} 

Buona fortuna!

Problemi correlati