2013-05-19 14 views
9

Wenn ich meine app starten läuft es eine AsyncTask zu laden und dann in onPostExecute ich dann setContentView an das neue Layout dann ein Fragment mit zwei Knöpfen bietet zwei Modi durch einen hinzufügen FragmentTransaction hinzufügen. Nachdem auf einen der beiden Modi geklickt wurde, wird das Fragment mit der Methode replace durch ein weiteres FragmentTransaction ersetzt.Ersetzte Fragment noch sichtbar

Wenn die App abstürzt, kehrt sie zum ersten Bildschirm zurück und lädt die beiden Schaltflächen mit den beiden Modi. In diesem Fall wird, wenn einer der beiden Modi ausgewählt ist, das zweite Fragment geladen, aber jetzt ist der Hintergrund plötzlich transparent und zeigt die beiden unteren Schaltflächen an, und sie bleiben anklickbar. Wenn sie erneut angeklickt werden, ersetzen sie das Fragment ordnungsgemäß, so dass es unten nicht sichtbar ist. Das ist einfach komisch, ich kann nicht verstehen, was das verursachen könnte.

Ich habe diese beiden ähnlichen Fragen, one und two, recherchiert und gesehen, was darauf hindeutet, dass es daran liegen könnte, dass die ID falsch ist oder ich das Fragment in XML definiert habe. Keiner dieser beiden Faktoren ist der Fall.

Mein Code ist unten dargestellt:

Im Folgenden werde ich die Ladebildschirm ersetzen.

@Override 
    protected void onPostExecute(Void result) { 
     setContentView(R.layout.activity_main_screen); 
     FragmentTransaction transaction = getSupportFragmentManager() 
       .beginTransaction(); 
     transaction.add(R.id.fragment_container, new ModeFragment()) 
       .commit(); 
      } 

Nach dem, wenn eine Schaltfläche geklickt wird ich das Fragment passieren Ich wünsche den Strom mit in dieses Verfahren unten ersetzen:

private void replaceCurrentFragment(Fragment fragment) { 
    FragmentTransaction transaction = getSupportFragmentManager() 
      .beginTransaction(); 
    transaction.replace(R.id.fragment_container, fragment) 
      .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 
      .addToBackStack(null).commit(); 
} 

Dies funktioniert beim ersten Mal, aber wenn ein Absturz auftritt, dann Die App kehrt zum ersten Fragment zurück und beim zweiten Mal, wenn diese Methode übergeben wird, ist das neue ersetzende Fragment halb unsichtbar. Ein Klick auf den Button des ersten Fragments ruft diese Methode erneut auf und es ist nun in Ordnung.

Offensichtlich möchte ich nicht, dass die App abstürzt, also sollte dies nicht auftreten, aber ich habe das Gefühl, dass etwas nicht stimmt, wie ich meinen Code schreibe.

Antwort

11

Ich hatte das gleiche Problem mit mir passiert, und es war, weil ich ein Fragment in der OnCreate meiner Aktivität geladen, ohne zu überprüfen, ob es ein SavedInstanceState, so dass Android zuerst alle alten Fragmente wieder öffnen, dann die OnCreate , die das Fragment über die alten hinzugefügt, ohne sie zu ersetzen also, wenn Sie zu einem anderen Fragment navigieren, ersetzt es nur die oberste, aber nicht die untere, so dass Sie die Fragmente darunter sehen.

Vielleicht nicht genau die gleiche Sache für Sie, aber es könnte Ihnen helfen, es herauszufinden.

+1

Dies sollte ein Kommentar sein als eine Antwort. –

+7

nein es ist nicht, das ist auch angemessen, um eine Antwort zu sein. – Zyoo

+0

Mein Problem war mit dem Hintergrund-Attribut im HoloGraph-Element (eine kleine Bibliothek zum Zeichnen von Diagrammen) in der XML-Layout-Datei meiner Zusammenfassung. Ich habe dieses Attribut gelöscht und es hat funktioniert. Ich habe mein Fragment nach dem Lösen ersetzt, um das Fragment zu aktualisieren, aber ich musste das Fragment nicht ersetzen, ich musste nur trennen, anhängen (ruft onCreateView des Fragments auf) und committen. Wenn Sie ein ähnliches Problem haben und Daten an Ihr Fragment übergeben müssen, empfehle ich eine Änderung, bei der Sie die Daten aus dem Bündel des Fragments in einige Felder einer anderen Klasse speichern. Greifen Sie auf sie in onCreateView des Fragments zu. – Metallica

Verwandte Themen