2012-10-16 5 views
9

Ich habe ein Problem mit einem fragmentierten Layout und ich entschuldige mich aufrichtig, wenn es zuvor beantwortet wurde und ich war zu dumm, es zu finden. Ich habe stundenlang gesucht und nichts bekommen (naja, ich habe viel, aber nichts hat mein Problem gelöst).Zurück Taste auf programmatisch hinzugefügt Fragment führt zu leeren Container

Also hier ist mein Setup: Ich habe ein Layout mit zwei Fenstern mit zwei FrameLayouts als Container für meine Fragmente. activity_listing.xml:

<FrameLayout android:id="@+id/listing" /> 
<FrameLayout android:id="@+id/details" /> 

Beim Öffnen der App (onCreate in der Aktivität des Fragments) ein Eintrag namens Fragment hinzugefügt wird FrameLayout "listing" mit programmatisch eine FragmentTransaction.

Dieses ListingFragment wird während der Laufzeit ein paar Mal ersetzt, daher muss ich es erstellen, anstatt es in XML zu definieren. Ich versuchte letzteres mit

, aber dann wird es später nicht ersetzt oder programmgesteuert entfernt. Ich kann nur hinzufügen() und dann ist das alte durch das neue sichtbar. Aber das ist nicht das Problem hier - nur eine Erklärung für meinen Weg.

Bis jetzt funktioniert alles wie es soll, Listing wird erstellt und angezeigt usw., also keine Probleme da. Aber:

Wenn ListingFragment beim Start angezeigt wird und ich die Zurück-Taste drücke, wird FrameLayout "Listing" an der letzten Position geleert, anstatt auf die Startseite zurückzukehren! Ich dachte, dass es sein muss, weil onCreate meiner ListingActivity ich einen leeren Rahmen anzeigen und ein ListingFragment hinzufügen(). Der hintere Stapel enthält also auch den leeren Rahmen. Recht?

Ich habe versucht, die Situation durch diese zu ListingActivity Lösung:

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    if(getSupportFragmentManager().getBackStackEntryCount() == 0) { 
     this.finish(); 
    } 
} 

Aber das ist irgendwie nicht richtig sehen oder fühlen ... es sieht aus wie eine schlechte Arbeit um.

Also gibt es eine Möglichkeit, das Fragment einzufügen, bevor die Ansicht mit dem leeren FrameLayout aufgebläht wird, so gibt es keinen leeren Zustand zu "zurück" zu? Oder ist es möglich, den "leeren" Zustand aus dem Backstack zu entfernen, obwohl er nicht drin ist? Gibt es noch weitere Ideen, wie man den leeren Rahmen nach dem "Zurück" vermeiden kann?

Vielen Dank für Ihre Bemühungen im Voraus!

+2

versuchen Sie, "ft.addToBackStack (null)" aus der hinzufügen-Transaktion in Ihrem onCreate zu entfernen. dann solltest du nichts mit onbackpressed tun müssen – toadzky

+0

Du hast Recht! Perfekt! Könnten Sie es bitte als Antwort posten, damit ich es als richtig markieren kann? Ich fühle mich jetzt ein bisschen dumm ... –

Antwort

11

Rufen Sie nicht ft.addToBackStack(null), wenn Sie das Fragment in onCreate hinzufügen. Das teilt dem FragmentManger mit, dass Sie vor diesem Fragment einen anderen Zustand haben, zu dem Sie zurück springen möchten.