2013-09-25 20 views
7

Ich interessiere mich für die beste Möglichkeit, eine einzelne Aktivität zu haben, die zwischen zwei Fragmenten wechselt.Der beste Weg, um zwischen zwei Fragmenten zu wechseln

Ich habe wahrscheinlich 15 Stack Overflow Beiträge und 5 Blogs Beiträge gelesen, wie man das macht, und, während ich denke, dass ich eine Lösung zusammengeschustert habe, bin ich nicht überzeugt, dass es die beste ist. Daher möchte ich die Meinungen der Menschen über den richtigen Umgang damit hören, insbesondere in Bezug auf den Lebenszyklus der Elternaktivität und der Fragmente. Hier

ist die Situation im Detail:

  1. Eine Mutter Aktivität, die eine von zwei möglichen Fragmenten anzeigen kann.
  2. Die beiden Fragmente haben einen Zustand, den ich über eine Sitzung hinweg beibehalten möchte, der jedoch nicht unbedingt zwischen Sitzungen bestehen muss.
  3. Eine Reihe anderer Aktivitäten, so dass die Elternaktivität und die Fragmente im Backstack vergraben und wegen zu wenig Arbeitsspeichers zerstört werden können.
  4. Ich möchte die Möglichkeit, die Zurück-Taste verwenden, um zwischen den Fragmenten zu bewegen (So wie ich es verstehe, kann ich nicht setRetainInstance verwenden).

Neben allgemeiner Architektur Beratung, ich habe die folgenden noch offene Fragen: werden

  1. Wenn die übergeordnete Aktivität aufgrund des geringen Speichers zerstört wird, wie kann ich garantieren, dass die Zustände beider Fragmente beibehalten werden , gemäß diesem Beitrag: When a Fragment is replaced and put in the back stack (or removed) does it stay in memory?. Brauche ich nur einen Zeiger auf jedes Fragment in der übergeordneten Aktivität?
  2. Wie kann die übergeordnete Aktivität am besten verfolgen, welches Fragment gerade angezeigt wird?

Vielen Dank im Voraus!

Antwort

6

Ich fügte schließlich beide Fragmente mit Hilfe des Support Fragment Manager und dann mit detach/attach, um zwischen ihnen zu wechseln.Ich konnte commitAllowingStateLoss() verwenden, weil ich den Zustand der Ansicht an anderer Stelle behalte und manuell das korrekte Fragment in onResume() setze.

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  

    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.add(R.id.my_layout, new AFragment(), TAG_A); 
    fragmentTransaction.add(R.id.my_layout, new BFragment(), TAG_B); 
    fragmentTransaction.commit(); 
} 

public void onResume() { 
    super.onResume(); 
    if (this.shouldShowA) { 
     switchToA(); 
    } else { 
     switchToB(); 
    } 
} 

private void switchToA() { 
    AFragment fragA = (AFragment) getSupportFragmentManager().findFragmentByTag(TAG_A); 
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    fragmentTransaction.detach(getSupportFragmentManager().findFragmentByTag(TAG_B)); 
    fragmentTransaction.attach(fragA); 
    fragmentTransaction.addToBackStack(null); 

    fragmentTransaction.commitAllowingStateLoss(); 
    getSupportFragmentManager().executePendingTransactions(); 
} 
2

Sie könnten die Verwendung einer ViewPager in Ihrer übergeordneten Aktivität in Betracht ziehen, damit Sie zwischen den Fragmenten wechseln können.

So würden Sie in der Lage sein, durch sie zu wischen.

Wenn Sie ihren Status während einer Sitzung beibehalten möchten, selbst wenn die übergeordnete Aktivität zerstört wird, müssen Sie sie Parcelable eingeben, damit Sie den Status auch dann speichern können, wenn die Klasse zu diesem Zeitpunkt nicht instanziiert wird. Sie müssen dies auch tun, wenn Sie Ihr Gerät drehen und die aktuelle Situation/Daten auf dem Bildschirm behalten möchten.

sollten Sie schreibt sie in eine Parcelable in ihren Methoden und erstellen Sie sie von ihm in der onResume ein. Auf diese Weise ist es egal, ob sie zerstört sind oder aufgrund von Änderungen in der Geräteausrichtung neu erstellt werden müssen.

Wenn Sie zwischen diesen Fragmenten mit der Schaltfläche "Zurück" wechseln können, können Sie die Schaltfläche für onBackPressed abfangen und entsprechend behandeln.

Wenn Sie herausfinden müssen, welches Fragment zu einem bestimmten Zeitpunkt angezeigt wird, fragen Sie Ihr ViewPager welches Fragment er zu dieser Zeit anzeigt, damit Sie nicht den Überblick behalten müssen, können Sie einfach jemanden fragen, der weiß, ob du musst es wissen.

+0

Danke für die Antwort. Ich glaube nicht, dass ich hier einen View Pager verwenden kann, da die Views nicht zwischengespielt werden sollten. Ich werde jedoch auf jeden Fall parzellierbar implementieren. Wo implementiere ich onBackPressed? – GLee

+0

OnBackPressed ist eine Methode einer Aktivität. Sie müssen es also dort überschreiben. –

Verwandte Themen