Partilhar via


Gerenciando fragmentos

Para ajudar no gerenciamento de fragmentos, o Android fornece a FragmentManager classe . Cada Atividade tem uma instância do Android.App.FragmentManager que localizará ou alterará dinamicamente seus Fragmentos. Cada conjunto dessas alterações é conhecido como uma transação e é executado usando uma das APIs contidas na classe Android.App.FragmentTransation, que é gerenciada pelo FragmentManager. Uma Atividade pode iniciar uma transação como esta:

FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();

Essas alterações nos Fragmentos são executadas na FragmentTransaction instância usando métodos como Add(), Remove(), e Replace(). as alterações são aplicadas usando Commit(). As alterações em uma transação não são executadas imediatamente. Em vez disso, eles estão agendados para serem executados no thread de interface do usuário da atividade o mais rápido possível.

O exemplo a seguir mostra como adicionar um fragmento a um contêiner existente:

// 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 uma transação for confirmada depois Activity.OnSaveInstanceState() de ser chamada, uma exceção será gerada. Isso acontece porque quando a Atividade salva seu estado, o Android também salva o estado de qualquer fragmento hospedado. Se qualquer transação fragmentada for confirmada após esse ponto, o estado dessas transações será perdido quando a Atividade for restaurada.

É possível salvar as transações fragmentar na pilha traseira da Atividade fazendo uma chamada para FragmentTransaction.AddToBackStack(). Isso permite que o usuário navegue para trás por meio de Alterações de fragmento quando o botão Voltar é pressionado. Sem uma chamada para esse método, fragmentos removidos serão destruídos e ficarão indisponíveis se o usuário navegar de volta pela Atividade.

O exemplo a seguir mostra como usar o AddToBackStack método de um FragmentTransaction para substituir um Fragmento, preservando o estado do primeiro Fragmento na pilha traseira:

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

Comunicando-se com fragmentos

O FragmentManager sabe sobre todos os Fragmentos anexados a uma Atividade e fornece dois métodos para ajudar a localizar esses Fragmentos:

  • FindFragmentById – esse método encontrará um Fragmento usando a ID especificada no arquivo de layout ou na ID do contêiner quando o fragmento foi adicionado como parte de uma transação.

  • FindFragmentByTag – esse método é usado para localizar um Fragmento que tenha uma marca fornecida no arquivo de layout ou que tenha sido adicionada em uma transação.

Os fragmentos e as atividades fazem referência ao FragmentManager, portanto, as mesmas técnicas são usadas para se comunicar entre eles. Um aplicativo pode encontrar um Fragmento de referência usando um desses dois métodos, converter essa referência ao tipo apropriado e, em seguida, chamar métodos diretamente no Fragmento. O snippet a seguir fornece um exemplo:

Também é possível que a Atividade use o FragmentManager para localizar fragmentos:

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

Comunicando-se com a atividade

É possível que um Fragmento use a Fragment.Activity propriedade para referenciar seu host. Ao converter a Atividade em um tipo mais específico, é possível que uma Atividade chame métodos e propriedades em seu host, conforme mostrado no exemplo a seguir:

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