6

Momentan habe ich einen "RELATIVE_LAYOUT" Container, den ich zum Hinzufügen meines Fragments verwende. Ich verwende OnClickListener auf einer Schaltfläche, um das Fragment-XML-Layout in den RelativeLayout-Container zu laden.Wie man Fragment auf Knopf klicken?

Was ich will, erreichen, ist, dass, wenn ich die Taste einmal drücken, sollte das Fragment laden ... und wenn ich es erneut drücken sollte das Fragment entfernt werden. Ich habe bereits versucht, mit integer anzugeben, ob ein Fragment geladen ist, aber es ist fehlgeschlagen. jede Hilfe dankbar ...

Code:

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

Antwort

12

Ihr Problem ist, dass Sie ein neuesFragment jedes Mal wenn Sie die Button klicken erstellen . Sie müssen erhalten eine Referenz auf die derzeitFragment und dann entfernen Sie diese.

Darüber hinaus müssen Sie nicht mehr die Flagge verwenden. Beim Hinzufügen des Fragment können Sie Tag es. Nach dem Entfernen der Fragment können Sie das Tag verwenden, das zum Hinzufügen der Fragment verwendet wird, um eine Referenz auf die aktuell hinzugefügte Fragment zu erhalten. Hier

ist ein Beispiel dafür, wie Sie es tun sollen:

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

Ja, ich würde nur hinzufügen, dass besserer Ansatz ist vollständig zu entfernen „hinzugefügt“ variabel und nur durch presention von Fragmenten in Fragment-Manager entscheiden .. In diesem Fall haben Sie weniger Arbeit mit der Wiederherstellung des Zustands nach der Drehung des Bildschirms – Billda

+0

Sie haben Recht, ich habe den Code angepasst :) –

+0

Ausgezeichnete Antwort ... ein Zweifel, obwohl, wenn das erste Mal, dass ich den Knopf drücke, erstellt Java ein Objekt FragmentOne f1 und übergibt ihm den von findFragmentByTag zurückgegebenen Wert, aber das Tag "tag" ist noch keinem Fragment zugeordnet, da wir das im if-Block tun. Also, sollte das nicht einen Fehler erzeugen ??? – Abhi9