Zarządzanie fragmentami
Aby ułatwić zarządzanie fragmentami, system Android udostępnia klasę FragmentManager
. Każde działanie ma wystąpienie Android.App.FragmentManager
, które będzie znajdować lub dynamicznie zmieniać jego fragmenty. Każdy zestaw tych zmian jest znany jako transakcja i jest wykonywany przy użyciu jednego z interfejsów API zawartych w klasie Android.App.FragmentTransation
, która jest zarządzana przez FragmentManager
program . Działanie może uruchomić transakcję w następujący sposób:
FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
Te zmiany w fragmentach są wykonywane w wystąpieniu FragmentTransaction
przy użyciu metod takich jak Add()
, Remove(),
a Replace().
zmiany są następnie stosowane przy użyciu metody Commit()
. Zmiany w transakcji nie są wykonywane natychmiast.
Zamiast tego są one zaplanowane do uruchomienia w wątku interfejsu użytkownika działania tak szybko, jak to możliwe.
W poniższym przykładzie pokazano, jak dodać fragment do istniejącego kontenera:
// 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();
Jeśli transakcja zostanie zatwierdzona po Activity.OnSaveInstanceState()
wywołaniu, zostanie zgłoszony wyjątek. Dzieje się tak, ponieważ gdy działanie zapisuje stan, system Android zapisuje również stan wszystkich hostowanych fragmentów. Jeśli jakiekolwiek transakcje fragmentu zostaną zatwierdzone po tym punkcie, stan tych transakcji zostanie utracony po przywróceniu działania.
Istnieje możliwość zapisania transakcji fragmentu w stosie zaplecza działania przez wywołanie metody FragmentTransaction.AddToBackStack()
. Dzięki temu użytkownik może przechodzić wstecz przez fragment zmienia się po naciśnięciu przycisku Wstecz . Bez wywołania tej metody usunięte fragmenty zostaną zniszczone i będą niedostępne, jeśli użytkownik przejdzie z powrotem przez działanie.
W poniższym przykładzie pokazano, jak użyć AddToBackStack
metody , FragmentTransaction
aby zastąpić jeden fragment, zachowując jednocześnie stan pierwszego fragmentu na stosie wstecznym:
// 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();
Komunikacja z fragmentami
Menedżer fragmentów wie o wszystkich fragmentach dołączonych do działania i udostępnia dwie metody ułatwiające znalezienie tych fragmentów:
FindFragmentById — ta metoda znajdzie fragment przy użyciu identyfikatora określonego w pliku układu lub identyfikatora kontenera, gdy fragment został dodany jako część transakcji.
FindFragmentByTag — ta metoda służy do znajdowania fragmentu zawierającego tag podany w pliku układu lub dodany w transakcji.
Oba fragmenty i działania odwołują się FragmentManager
do elementu , więc te same techniki są używane do komunikowania się między nimi. Aplikacja może znaleźć fragment odwołania przy użyciu jednej z tych dwóch metod, rzutować to odwołanie do odpowiedniego typu, a następnie bezpośrednio wywoływać metody w fragmentcie. Poniższy fragment kodu zawiera przykład:
Istnieje również możliwość użycia działania w celu znalezienia FragmentManager
fragmentów:
var emailList = FragmentManager.FindFragmentById<EmailListFragment>(Resource.Id.email_list_fragment);
emailList.SomeCustomMethod(parameter1, parameter2);
Komunikacja z działaniem
Fragment może używać Fragment.Activity
właściwości do odwołowania się do hosta. Rzutując działanie na bardziej konkretny typ, można wywołać metody i właściwości na hoście, jak pokazano w poniższym przykładzie:
var myActivity = (MyActivity) this.Activity;
myActivity.SomeCustomMethod();