Verwalten von Fragmenten
Um bei der Verwaltung von Fragmenten zu helfen, stellt Android die FragmentManager
-Klasse bereit. Jede Aktivität verfügt über eine instance, die Android.App.FragmentManager
ihre Fragmente findet oder dynamisch ändert. Jede Gruppe dieser Änderungen wird als Transaktion bezeichnet und wird mithilfe einer der APIs ausgeführt, die in der -Klasse Android.App.FragmentTransation
enthalten sind, die von FragmentManager
verwaltet wird. Eine Aktivität kann eine Transaktion wie folgt starten:
FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
Diese Änderungen an den Fragmenten werden im FragmentTransaction
instance mit Methoden wie Add()
und Remove(),
Replace().
Die Änderungen werden dann mit Commit()
angewendet. Die Änderungen in einer Transaktion werden nicht sofort ausgeführt.
Stattdessen wird geplant, dass sie so schnell wie möglich im UI-Thread der Aktivität ausgeführt werden.
Das folgende Beispiel zeigt, wie sie einem vorhandenen Container ein Fragment hinzufügen:
// Create a new fragment and a transaction.
FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
DetailsFragment aDifferentDetailsFrag = new DetailsFragment();
// The fragment will have the ID of Resource.Id.fragment_container.
fragmentTx.Add(Resource.Id.fragment_container, aDifferentDetailsFrag);
// Commit the transaction.
fragmentTx.Commit();
Wenn eine Transaktion nach Activity.OnSaveInstanceState()
dem Aufruf eines Commits ausgeführt wird, wird eine Ausnahme ausgelöst. Dies geschieht, da Android auch den Zustand aller gehosteten Fragmente speichert, wenn die Aktivität ihren Status speichert. Wenn fragmentierte Transaktionen nach diesem Punkt committet werden, geht der Zustand dieser Transaktionen verloren, wenn die Aktivität wiederhergestellt wird.
Es ist möglich, die Fragmenttransaktionen im Back stack der Aktivität zu speichern, indem Sie einen Aufruf von ausführen FragmentTransaction.AddToBackStack()
. Dadurch kann der Benutzer rückwärts durch Fragmentänderungen navigieren, wenn die Schaltfläche Zurück gedrückt wird. Ohne einen Aufruf dieser Methode werden entfernte Fragmente zerstört und sind nicht verfügbar, wenn der Benutzer durch die Aktivität navigiert.
Das folgende Beispiel zeigt, wie Sie die AddToBackStack
Methode eines FragmentTransaction
verwenden, um ein Fragment zu ersetzen, während der Zustand des ersten Fragments auf dem back stack beibehalten wird:
// Create a new fragment and a transaction.
FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
DetailsFragment aDifferentDetailsFrag = new DetailsFragment();
// Replace the fragment that is in the View fragment_container (if applicable).
fragmentTx.Replace(Resource.Id.fragment_container, aDifferentDetailsFrag);
// Add the transaction to the back stack.
fragmentTx.AddToBackStack(null);
// Commit the transaction.
fragmentTx.Commit();
Kommunikation mit Fragmenten
Der FragmentManager kennt alle Fragmente, die an eine Aktivität angefügt sind, und stellt zwei Methoden bereit, um diese Fragmente zu finden:
FindFragmentById : Diese Methode sucht ein Fragment mithilfe der ID, die in der Layoutdatei oder der Container-ID angegeben wurde, als das Fragment als Teil einer Transaktion hinzugefügt wurde.
FindFragmentByTag : Diese Methode wird verwendet, um ein Fragment zu finden, das über ein Tag verfügt, das in der Layoutdatei bereitgestellt oder in einer Transaktion hinzugefügt wurde.
Sowohl Fragmente als auch Aktivitäten verweisen auf , FragmentManager
sodass dieselben Techniken verwendet werden, um zwischen ihnen hin und her zu kommunizieren. Eine Anwendung kann ein Referenzfragment mithilfe einer dieser beiden Methoden finden, diesen Verweis auf den entsprechenden Typ umwandeln und dann direkt Methoden für das Fragment aufrufen. Der folgende Codeausschnitt enthält ein Beispiel:
Es ist auch möglich, dass die Aktivität das FragmentManager
verwendet, um Fragmente zu finden:
var emailList = FragmentManager.FindFragmentById<EmailListFragment>(Resource.Id.email_list_fragment);
emailList.SomeCustomMethod(parameter1, parameter2);
Kommunikation mit der Aktivität
Es ist möglich, dass ein Fragment die Fragment.Activity
-Eigenschaft verwendet, um auf seinen Host zu verweisen. Durch Das Umwandeln der Aktivität in einen spezifischeren Typ ist es möglich, dass eine Aktivität Methoden und Eigenschaften auf ihrem Host aufruft, wie im folgenden Beispiel gezeigt:
var myActivity = (MyActivity) this.Activity;
myActivity.SomeCustomMethod();