Управление фрагментамиManaging Fragments

Чтобы упростить управление фрагментами, Android предоставляет FragmentManager класса.To help with managing Fragments, Android provides the FragmentManager class. Каждое действие имеет экземпляр Android.App.FragmentManager , позволяющие найти и динамически изменить его фрагментов.Each Activity has an instance of Android.App.FragmentManager that will find or dynamically change its Fragments. Каждый набор этих изменений называется транзакциии выполняется с помощью одного из API-интерфейсы, содержащиеся в классе Android.App.FragmentTransation, которое управляется FragmentManager.Each set of these changes is known as a transaction, and is performed by using one of the APIs contained in the class Android.App.FragmentTransation, which is managed by the FragmentManager. Действие может запустить транзакцию следующим образом:An Activity may start a transaction like this:

FragmentTransaction fragmentTx = this.FragmentManager.BeginTransaction();

Эти изменения фрагментам выполняются в FragmentTransaction экземпляра с помощью методов, таких как Add(), Remove(), и Replace(). изменения применяются с помощью Commit().These changes to the Fragments are performed in the FragmentTransaction instance by using methods such as Add(), Remove(), and Replace(). The changes are then applied by using Commit(). Изменения в транзакции не выполняются немедленно.The changes in a transaction are not performed immediately. Вместо этого они планируются для запуска в потоке пользовательского интерфейса, действия, как можно скорее.Instead, they are scheduled to run on the Activity's UI thread as soon as possible.

В следующем примере показано, как добавить фрагмент в существующий контейнер:The following example shows how to add a Fragment to an existing container:

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

Если транзакция фиксируется после Activity.OnSaveInstanceState() является именем, будет создано исключение.If a transaction is committed after Activity.OnSaveInstanceState() is called, an exception will be thrown. Это происходит потому, что когда действие сохраняет свое состояние, Android также сохраняет состояние любого размещенного фрагментов.This happens because when the Activity saves its state, Android also saves the state of any hosted Fragments. Если любой фрагмент транзакции будут зафиксированы после этой точки, состояние этих транзакций будут потеряны при восстановлении действия.If any Fragment transactions are committed after this point, the state of these transactions will be lost when the Activity is restored.

Существует возможность сохранения транзакции фрагмент в действие стек переходов назад с помощью вызова FragmentTransaction.AddToBackStack().It's possible to save the Fragment transactions to the Activity's back stack by making a call to FragmentTransaction.AddToBackStack(). Это позволяет пользователю переходить назад с помощью фрагмента изменяется, когда обратно нажатии кнопки.This allows the user to navigate backwards through Fragment changes when the Back button is pressed. Без вызова этого метода фрагментов, которые будут удалены будут уничтожены и будут недоступны, если пользователь перемещается обратно через действия.Without a call to this method, Fragments that are removed will be destroyed and will be unavailable if the user navigates back through the Activity.

В следующем примере показано, как использовать AddToBackStack метод FragmentTransaction для замены одного фрагмента, сохраняя состояние первый фрагмент в стеке переходов назад:The following example shows how to use the AddToBackStack method of a FragmentTransaction to replace one Fragment, while preserving the state of the first Fragment on the back stack:

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

Взаимодействие с использованием фрагментовCommunicating with Fragments

FragmentManager было известно обо всех фрагментов, вложенные в действие и предоставляет два метода для поиска этих фрагментов:The FragmentManager knows about all of the Fragments that are attached to an Activity and provides two methods to help find these Fragments:

  • FindFragmentById – этот метод будет найти фрагмент с помощью идентификатора, который был указан в файле макета или идентификатор контейнера, при добавлении фрагмента как часть транзакции.FindFragmentById – This method will find a Fragment by using the ID that was specified in the layout file or the container ID when the Fragment was added as part of a transaction.

  • FindFragmentByTag – этот метод используется, чтобы найти фрагмент, который содержит тег, который был указан в файле макета или который был добавлен в транзакции.FindFragmentByTag – This method is used to find a Fragment that has a tag that was provided in the layout file or that was added in a transaction.

Справочник по фрагментов и действий FragmentManager, таким образом, те же методы используются для обмена данными и обратно, между ними.Both Fragments and Activities reference the FragmentManager, so the same techniques are used to communicate back and forth between them. Приложение может найти ссылку фрагмента с помощью одного из этих двух методов, приведение ссылки к соответствующему типу и напрямую вызывать методы в фрагменте.An application may find a reference Fragment by using one of these two methods, cast that reference to the appropriate type, and then directly call methods on the Fragment. Пример в следующем фрагменте кода:The following snippet provides an example:

Возможна также действие, которое используется FragmentManager для поиска фрагментов:It is also possible for the Activity to use the FragmentManager to find Fragments:

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

Связи с действияCommunicating with the Activity

Можно использовать фрагмента Fragment.Activity свойство для ссылки на узел.It is possible for a Fragment to use the Fragment.Activity property to reference its host. Путем приведения действие более конкретный тип, можно действие может вызывать методы и свойства своего узла, как показано в следующем примере:By casting the Activity to a more specific type, it is possible for an Activity to call methods and properties on its host, as shown in the following example:

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