Gestione dei frammenti
Per semplificare la gestione dei frammenti, Android fornisce la FragmentManager
classe . Ogni attività ha un'istanza di Android.App.FragmentManager
che troverà o cambierà dinamicamente i frammenti. Ogni set di queste modifiche è noto come transazione e viene eseguito usando una delle API contenute nella classe Android.App.FragmentTransation
, gestita da FragmentManager
. Un'attività può avviare una transazione simile alla seguente:
FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();
Queste modifiche ai frammenti vengono eseguite nell'istanza FragmentTransaction
usando metodi come Add()
e Remove(),
Replace().
Le modifiche vengono quindi applicate tramite Commit()
. Le modifiche in una transazione non vengono eseguite immediatamente.
Vengono invece pianificati per l'esecuzione nel thread dell'interfaccia utente dell'attività il prima possibile.
L'esempio seguente illustra come aggiungere un frammento a un contenitore esistente:
// 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();
Se viene eseguito il commit di una transazione dopo Activity.OnSaveInstanceState()
la chiamata, verrà generata un'eccezione. Ciò si verifica perché quando l'attività salva lo stato, Android salva anche lo stato di qualsiasi frammento ospitato. Se dopo questo punto viene eseguito il commit di transazioni fragment, lo stato di queste transazioni andrà perso quando viene ripristinata l'attività.
È possibile salvare le transazioni Fragment nello stack back dell'attività effettuando una chiamata a FragmentTransaction.AddToBackStack()
. In questo modo l'utente può spostarsi all'indietro tra le modifiche frammento quando viene premuto il pulsante Indietro . Senza una chiamata a questo metodo, i frammenti rimossi verranno eliminati definitivamente e non saranno disponibili se l'utente torna all'attività.
Nell'esempio seguente viene illustrato come usare il AddToBackStack
metodo di un FragmentTransaction
oggetto per sostituire un frammento, mantenendo allo stesso tempo lo stato del primo frammento nello stack posteriore:
// 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();
Comunicazione con frammenti
FragmentManager conosce tutti i frammenti associati a un'attività e fornisce due metodi per trovare questi frammenti:
FindFragmentById : questo metodo troverà un frammento usando l'ID specificato nel file di layout o l'ID contenitore quando il frammento è stato aggiunto come parte di una transazione.
FindFragmentByTag : questo metodo viene usato per trovare un frammento con un tag fornito nel file di layout o aggiunto in una transazione.
I frammenti e le attività fanno riferimento a FragmentManager
, quindi le stesse tecniche vengono usate per comunicare tra di esse. Un'applicazione può trovare un frammento di riferimento usando uno di questi due metodi, eseguire il cast del riferimento al tipo appropriato e quindi chiamare direttamente i metodi nel frammento. Il frammento di codice seguente fornisce un esempio:
È anche possibile che l'attività usi per FragmentManager
trovare frammenti:
var emailList = FragmentManager.FindFragmentById<EmailListFragment>(Resource.Id.email_list_fragment);
emailList.SomeCustomMethod(parameter1, parameter2);
Comunicazione con l'attività
È possibile che un frammento usi la Fragment.Activity
proprietà per fare riferimento al relativo host. Eseguendo il cast dell'attività a un tipo più specifico, è possibile che un'attività chiami metodi e proprietà nell'host, come illustrato nell'esempio seguente:
var myActivity = (MyActivity) this.Activity;
myActivity.SomeCustomMethod();