6

Attualmente ho un contenitore "RELATIVE_LAYOUT" che sto usando per aggiungere il mio frammento. Sto utilizzando OnClickListener su un pulsante per caricare il layout XML del frammento nel contenitore RelativeLayout.Come aggiungere/rimuovere frammenti sul pulsante fare clic?

Quello che voglio ottenere è che quando premo il pulsante una volta, il frammento dovrebbe caricarsi ... e quando lo premo di nuovo il frammento dovrebbe essere rimosso. Ho già provato a utilizzare l'intero per identificare se il frammento è stato caricato, ma non è riuscito. Qualsiasi aiuto apprezzato ...

CODICE:

public class MainActivity extends Activity { 
    Button B1,B2; 
    int boolb1=0, boolb2=0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     B1 = (Button)findViewById(R.id.btn1); 
     B2 = (Button)findViewById(R.id.btn2); 

     B1.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       FragmentManager fm = getFragmentManager(); 
       FragmentTransaction ft = fm.beginTransaction(); 
       FragmentOne f1 = new FragmentOne(); 

       if(boolb1==0) 
       {ft.add(R.id.frg1, f1); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
       boolb1=1;} 
       else 
       {ft.remove(f1); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
       boolb1=0;} 
       //ft.addToBackStack("f1"); 
       ft.commit(); 
      } 
     }); 

     B2.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       FragmentManager fm = getFragmentManager(); 
       FragmentTransaction ft = fm.beginTransaction(); 
       FragmentTwo f2 = new FragmentTwo(); 

       if(boolb2==0) { 
        ft.add(R.id.frg2, f2); 
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
        boolb2=1; 
       } else { 
        ft.remove(f2); 
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
        boolb2=0; 
       } 

       //ft.addToBackStack("f2"); 
       ft.commit(); 
      } 
     }); 
    } 

risposta

12

Il tuo problema è che si crea un nuovo Fragment ogni volta che si fa clic sul Button. È necessario ottenere un riferimento alloFragment attualmente aggiunto e quindi rimuoverlo.

Inoltre, non è più necessario utilizzare la bandiera. Quando si aggiunge Fragment, è possibile tag it. Dopo aver rimosso lo Fragment, è possibile utilizzare il tag utilizzato per aggiungere lo Fragment per ottenere un riferimento allo Fragment attualmente aggiunto.

Ecco un esempio di come si dovrebbe fare:

private Button B1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    B1 = (Button)findViewById(R.id.btn1); 

    B1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      FragmentManager fm = getFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      FragmentOne f = (FragmentOne) fm.findFragmentByTag("tag"); 

      if(f == null) { // not added 
       f = new FragmentOne(); 
       ft.add(R.id.frg1, f, "tag"); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 

      } else { // already added 

       ft.remove(f); 
       ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
      } 

      ft.commit(); 
     } 
    }); 

    // and so on ... 
} 
+0

Sì, vorrei solo aggiungere che l'approccio migliore è quello di rimuovere completamente "ha aggiunto" variabile e solo decidere da presention di frammenti in Gestione frammento .. in tal caso avrai meno lavoro con il ripristino dello stato dopo la rotazione dello schermo – Billda

+0

Hai ragione, ho regolato il codice :) –

+0

Ottima risposta ... un dubbio però, quando per la prima volta premo il pulsante, java crea un oggetto di FragmentOne f1 e passa il valore restituito da findFragmentByTag, ma il tag "tag" non è ancora associato a nessun frammento poiché lo facciamo nel blocco if. Quindi, non dovrebbe generare un errore ??? – Abhi9

Problemi correlati