2014-11-18 24 views
6

Nella mia applicazione ho un'attività principale e diversi frammenti. quando l'utente fa clic sul pulsante Indietro, i frammenti vengono visualizzati uno alla volta. Voglio identificare quale frammento si trova attualmente nello stack posteriore. Quindi utilizzare per identificare i frammenti in base al nome del tag del frammento. Ho usato il seguente segmento di codice per ottenere il nome del tag del frammento ma restituisce sempre un valore nullo.findFragmentByTag() restituisce sempre null - Android

FragmentManager fm = MainActivity.this.getSupportFragmentManager(); 
String fragmentTag = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName(); 

please help.

Modifica,

sostituzione frammento con tag,

FragmentManager fm = MainActivity.this.getSupportFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.activity_main_content_fragment, fragment, text); 
+3

hanno impostato TAG nel frammento? –

+0

vedi la mia domanda modificata – user3800832

+0

btw dov'è la riga 'findFragmentByTag()' ?? –

risposta

9

ho trovato il mio errore, è ho dimenticato di aggiungere TAG to back stack.

FragmentManager fm = mainActivity.getSupportFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.activity_main_content_fragment, fragment, text); 
ft.addToBackStack(text); 

E poi posso ottenere il frammento nome TAG corrente nel seguente modo,

FragmentManager fm = MainActivity.this.getSupportFragmentManager(); 
String currentFragmentTag = fm.getBackStackEntryAt(fm.getBackStackEntryCount() - 1).getName(); 
+5

Non dovresti chiamare 'addToBackStack()' per far funzionare questa chiamata. Cosa succede se si desidera che il gestore dei frammenti manipoli i frammenti ma non lo sostituisca storicamente. Questa non dovrebbe essere la risposta corretta. – AeroEchelon

+0

addToBackStack non è pensato per questo scopo ... Tag e addToBackStack sono cose diverse. –

13

È necessario menzionare il TAG, mentre l'aggiunta/sostituzione:

ft.replace(R.id.container, newFragment,"fragment_tag_String"); 

O

ft.add(R.id.container, newFragment,"fragment_tag_String"); 

Add il frammento in BackSta ck come:

ft.addToBackStack("fragment_tag_String"); 

Quindi è possibile riutilizzarlo con

getSupportFragmentManager().findFragmentByTag("fragment_tag_String"); 

consultare:

Edit:

chiamata getSupportFragmentManager().executePendingTransactions() dopo aver fatto la transazione

FragmentManager fm = MainActivity.this.getSupportFragmentManager(); 
FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.activity_main_content_fragment, fragment, text); 
ft.commit(); 
fm.executePendingTransactions(); 

Spero che vi aiuterà a ツ

+2

ho usato il primo modo per sostituire i frammenti. ma è sempre restituito valore nullo. – user3800832

+0

in questo modo, FragmentManager fm = mainActivity.getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); \t \t ft.replace (R.id.activity_main_content_fragment, fragment, text); – user3800832

+0

qual è il valore nella variabile di testo? assicurati che non sia "" –

Problemi correlati