Sdílet prostřednictvím


Správa fragmentů

Android poskytuje FragmentManager třídu, která vám pomůže se správou fragmentů. Každá aktivita má instanci Android.App.FragmentManager , která najde nebo dynamicky změní její fragmenty. Každá sada těchto změn se označuje jako transakce a provádí se pomocí jednoho z rozhraní API obsažených ve třídě Android.App.FragmentTransation, která je spravována FragmentManager. Aktivita může spustit transakci takto:

FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();

Tyto změny fragmentů se provádějí v FragmentTransaction instanci pomocí metod, jako Add()je , Remove(), a Replace(). změny se pak použijí pomocí Commit(). Změny v transakci se neprovedou okamžitě. Místo toho se plánují, aby se co nejdříve spustily ve vlákně uživatelského rozhraní aktivity.

Následující příklad ukazuje, jak přidat fragment do existujícího kontejneru:

// 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();

Pokud je transakce potvrzena po Activity.OnSaveInstanceState() zavolání, vyvolá se výjimka. K tomu dochází, protože když aktivita uloží svůj stav, Uloží Android také stav všech hostovaných fragmentů. Pokud jsou transakce fragmentu potvrzeny po tomto bodu, stav těchto transakcí bude ztracen při obnovení aktivity.

Transakce fragmentů je možné uložit do back stacku aktivity provedením volání FragmentTransaction.AddToBackStack(). Uživatel tak může při stisknutí tlačítka Zpět procházet změny fragmentu. Bez volání této metody budou fragmenty, které jsou odebrány, zničeny a nebudou k dispozici, pokud uživatel přejde zpět přes aktivitu.

Následující příklad ukazuje, jak použít AddToBackStack metodu FragmentTransaction nahrazení jednoho fragmentu při zachování stavu prvního fragmentu na zadním zásobníku:

// 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();

Komunikace s fragmenty

FragmentManager ví o všech fragmentech, které jsou připojené k aktivitě, a poskytuje dvě metody, které vám pomůžou tyto fragmenty najít:

  • FindFragmentById – Tato metoda najde fragment pomocí ID, které bylo zadáno v souboru rozložení nebo ID kontejneru při přidání fragmentu jako součást transakce.

  • FindFragmentByTag – Tato metoda slouží k vyhledání fragmentu, který má značku, která byla poskytnuta v souboru rozložení nebo byla přidána do transakce.

Fragmenty i aktivity odkazují na FragmentManager, takže stejné techniky se používají ke komunikaci mezi nimi a zpět. Aplikace může najít odkaz Fragment pomocí jedné z těchto dvou metod, přetypovat tento odkaz na příslušný typ a pak přímo volat metody fragmentu. Následující fragment kódu obsahuje příklad:

Aktivitu je také možné použít FragmentManager k vyhledání fragmentů:

var emailList = FragmentManager.FindFragmentById<EmailListFragment>(Resource.Id.email_list_fragment);
emailList.SomeCustomMethod(parameter1, parameter2);

Komunikace s aktivitou

Fragment může použít Fragment.Activity vlastnost odkazující na svého hostitele. Přetypováním aktivity na konkrétnější typ je možné, aby aktivita volala metody a vlastnosti na svém hostiteli, jak je znázorněno v následujícím příkladu:

var myActivity = (MyActivity) this.Activity;
myActivity.SomeCustomMethod();