2013-04-07 16 views
32
FragmantClass rSum = new FragmantClass(); 
getSupportFragmentManager().beginTransaction().remove(rSum).commit();  

Sto cercando di rimuovere questo frammento, quando carico un altro frammento. Il frammento di cui sopra non viene rimosso. Ecco il metodo che sto chiamando per cambiare i frammenti.Rimozione di frammenti da un'attività

public void switchContent(Fragment fragment) { 
    FragmantClass rSum = new FragmantClass(); 
    getSupportFragmentManager().beginTransaction().remove(rSum).commit(); 
    mContent = fragment; 
    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.content_frame, fragment) 
     .commit(); 
    getSlidingMenu().showContent(); 
} 

risposta

39
getSupportFragmentManager().beginTransaction(). 
remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit(); 

Prova questo, dovrebbe funzionare.

public void switchContent(Fragment fragment) { 
    getSupportFragmentManager().beginTransaction(). 
    remove(getSupportFragmentManager().findFragmentById(R.id.frame)).commit(); 
    mContent = fragment; 
    getSupportFragmentManager() 
     .beginTransaction() 
     .replace(R.id.content_frame, fragment) 
     .commit(); 
    getSlidingMenu().showContent(); 
} 
7

Questa è una soluzione molto semplice per SupportFragmentManager. FragmentManager non è così conveniente, ma ancora efficace:

List<Fragment> fragmentList = getSupportFragmentManager().getFragments(); 
// You might have to access all the fragments by their tag, 
// in which case just follow the line below to remove the fragment 
if (fragmentList == null) { 
    // code that handles no existing fragments 
} 

for (Fragment frag : fragmentList) 
{ 
    // To save any of the fragments, add this check 
    // a tag can be added as a third parameter to the fragment when you commit it 
    if (frag.getTag().equals("<tag-name")) { 
     continue; 
    } 

    getSupportFragmentManager().beginTransaction().remove(frag).commit(); 
} 

o, se si è costretti a usarlo (ma non consigliato):

.commitAllowingStateLoss(); 

Se si sta rimuovendo tutti i frammenti la vista più volte, si potrebbe considerare di verificare se il fram corrente è nullo o isDetached() o isRemoving() o si potrebbe ottenere un NullPointerExceptions.

Aggiornamento 6-9-15: La documentazione per getSupportFragmentManger().getFragments() è apparentemente hidden ora, ma funziona ancora bene nel mio codice. Ecco lo screenshot della documentazione:

enter image description here

Aggiornamento 8-3-15: Se non si utilizza la libreria di supporto per i frammenti, non v'è, purtroppo, non getFragments() a disposizione, ma ci sono ancora un paio , più scomodo, opzioni.

  1. Dare ad ogni fragment un tag o id momento della creazione e iterare attraverso di loro per elaborare ciascun fragment lo desideri.
  2. creare un listener utilizzando onAttachListener così ogni volta che un nuovo fragment è attaccato al activity, è possibile memorizzare che fragment, e poi iterare che la struttura dei dati per elaborare ogni fragment, se lo desideri.

Quando non si utilizza il getSupportFragmentManager(), per elaborare una transazione è necessario utilizzare getFragmentManager().

+0

Potete fornire il collegamento al metodo 'getFragments()'? –

+1

@IvanBlack, a quanto pare non c'è nessun collegamento disponibile. Sono certo che la documentazione fosse disponibile per questo articolo quando ho scritto questo post, ma l'API mostra che è nascosta, pensava che funzionasse ancora. – craned

10

Nel mio caso personale, aggiungo e rimuovo frammento in questo modo:

if(getSupportFragmentManager().findFragmentById(R.id.container) != null) { 
     getSupportFragmentManager() 
       .beginTransaction(). 
       remove(getSupportFragmentManager().findFragmentById(R.id.container)).commit(); 
    } 
    getSupportFragmentManager() 
      .beginTransaction() 
      .replace(R.id.container, fragment) 
      .commit(); 

sempre è bene verificare se il vostro contenitore di avere un frammento o avrà un'eccezione nulla

+1

grazie amico! funziona perfettamente. –

-1

più semplice, è possibile sostituire il contenuto principale con un frammento vuoto, in modo che l'attività principale sia visualizzata solo.

getFragmentManager() 
.beginTransaction() 
.replace(main_content,new Fragment()) 
.commit();