Для того, щоб повторно використовувати компоненти Fragment UI (фрагмент користувальницького інтерфейсу), ви повинні створити кожен з них як абсолютно автономний, модульний компонент, в якому визначені власний макет і поведінка.
Після того, коли будуть визначені ці багаторазові Fragments, ви можете асоціювати їх з Activity і з'єднати з логікою додатку для реалізації загальної складової UI.
Часто буде необхідно, щоб один фрагмент спілкуватися з іншим, наприклад, змінював зміст, заснований на події користувача. Всі комунікації Fragment-до-Fragment робляться через відповідну Activity. Два Fragments ніколи не повинні спілкуватися безпосередньо.
Визначення інтерфейсу
Щоб Fragment мав комунікацію зі своєю Activity, можна визначити інтерфейс в класі Fragment, а його реалізацію в Activity. Activity захоплює реалізацію інтерфейсу під час свого методу onAttach() життєвого циклу , а потім може викликати методи Interface для того, щоб спілкуватися з Activity.
Приклад комунікації Fragment з Activity:
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
// Контейнер Activity повинен реалізувати цей інтерфейс
public interface OnHeadlineSelectedListener {
public void onArticleSelected(int position);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// Тут переконайтеся, що контейнер activity реалізував
// зворотний виклик інтерфейсу. Якщо ні, то видається виняток
try {
mCallback = (OnHeadlineSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnHeadlineSelectedListener");
}
}
...
}
Тепер фрагмент може доставляти повідомлення в activity, викликаючи метод onArticleSelected() (або інші методи в інтерфейсі), використовуючи екземпляр mCallback інтерфейсу OnHeadlineSelectedListener.
Наприклад, наступний метод в фрагменті викликається, коли користувач натискає на елемент списку. Фрагмент використовує інтерфейс зворотного виклику, щоб передати подію в батьківську activity:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// відправка події до приймаючої activity
mCallback.onArticleSelected(position);
}
Реалізація інтерфейсу
Для того, щоб отримати зворотні виклики подій від фрагмента, activity, яка є хостом, повинна реалізувати інтерфейс, визначений у класі фрагмента.
Наприклад, наступна activity реалізує інтерфейс з наведеного вище прикладу:
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
...
public void onArticleSelected(int position) {
// Користувач вибрав заголовок статті з HeadlinesFragment
// Зробіть що-небудь тут, щоб побачити статтю
}
}
Доставка повідомлення до фрагменту
Хост-activity може доставляти повідомлення до фрагменту шляхом захоплення екземпляра Fragment за допомогою findFragmentById(), а потім безпосередньо викликати публічні методи фрагмента.
Наприклад, уявіть, що показана вище activity може містити інший фрагмент, який використовується для відображення елемента, зазначеного в даних, які повертаються вище в методі зворотного виклику. У цьому випадку, activity може передавати інформацію, отриману в методі зворотного виклику, до іншого фрагмента, який буде відображати елемент:
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
...
public void onArticleSelected(int position) {
// Користувач вибрав заголовок статті з HeadlinesFragment
// Зробіть що-небудь тут, щоб побачити статтю
ArticleFragment articleFrag = (ArticleFragment)
getSupportFragmentManager().findFragmentById(R.id.article_fragment);
if (articleFrag != null) {
// Якщо шматок статті доступний, то він в двох панельному макеті...
// Викликаємо метод в ArticleFragment для оновлення його змісту
articleFrag.updateArticleView(position);
} else {
// Інакше, маємо одно панельний макет і повинні поміняти шматок...
// Створити фрагмент і дати йому аргумент для обраної статті
ArticleFragment newFragment = new ArticleFragment();
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// Замінити все у вигляді контейнеру фрагмента з цього фрагмента,
// і додати транзакцію в задній стек, щоб користувач міг повернутися назад
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Виконати транзакцію
transaction.commit();
}
}
}
На закынчення, навчальны выдео:
(Джерело: developer.android.com)