8. Фрагменты - kpb90/start_android GitHub Wiki

Фрагменты- мини-Activit со своим lifecycle.

Жизненный цикл (На основе примера, в котором два фрагментан находятся в определенной Activity)

onAttach – фрагмент прикреплен к Activity и получает ссылку на него. В дальнейшем мы всегда можем получить ссылку на Activity, вызвав метод getActivity().

onCreate - это аналог метода onCreate у Activity, но здесь мы пока не имеет доступа к UI-элементам

onCreateView – здесь вы создаете View, который будет содержимым фрагмента, и отдаете его системе onActivityCreated – сообщает фрагменту о том, что Activity создано и можно работать с UI-элементами

onStart – аналогичен методу Activity, фрагмент виден пользователю

onResume - аналогичен методу Activity, фрагмент доступен для взаимодействия.

Запуск приложения:

  • Fragment1 onAttach
  • Fragment1 onCreate
  • Fragment1 onCreateView
  • Fragment2 onAttach
  • Fragment2 onCreate
  • Fragment2 onCreateView
  • MainActivity onCreate
  • Fragment1 onActivityCreated
  • Fragment2 onActivityCreated
  • MainActivity onStart
  • Fragment1 onStart
  • Fragment2 onStart
  • MainActivity onResume
  • Fragment1 onResume
  • Fragment2 onResume

Нажатие кнопки назад:

  • Fragment1 onPause
  • Fragment2 onPause
  • MainActivity onPause
  • Fragment1 onStop
  • Fragment2 onStop
  • MainActivity onStop
  • Fragment1 onDestroyView
  • Fragment1 onDestroy
  • Fragment1 onDetach
  • Fragment2 onDestroyView
  • Fragment2 onDestroy
  • Fragment2 onDetach
  • MainActivity onDestroy

Фрагменты, так же как и Activity могут сохранять данные при своем пересоздании, например при смене экрана. Для записи используется метод onSaveInstanceState. А прочесть данные можно из Bundle в методах onCreate, onCreateView или onActivityCreated.

А чтобы при пересоздании сохранить сам объект класса Fragment, используйте метод setRetainInstance. Если передать в него true, то при пересоздании фрагмента не будут вызваны методы onDestroy и onCreate, и не будет создан новый экземпляр класса Fragment.

Fragments. Динамическая работа

Android позволяет добавлять, удалять и заменять фрагменты друг другом. При этом мы можем сохранять все эти манипуляции в BackStack и кнопкой Назад отменять.

Все эти манипуляции можно делать с помощью менеджера фрагментов, который можно получить с помощью метода getFragmentManager.

Пример:

fTrans = getFragmentManager().beginTransaction(); // добавления фрагментов, замена, удаления fTrans.commit();

Чтобы сохранять историю транзакции используется метод addToBackStack. При нажатии кнопки назад Android просто будет доставать из backstack транзакции, которые работали с фрагментами.

fTrans.addToBackStack(null);

Когда мы удаляем фрагмент и не добавляем транзакцию в BackStack, то фрагмент уничтожается. Если же транзакция добавляется в BackStack, то, при удалении, фрагмент не уничтожается (onDestroy не вызывается), а останавливается (onStop).

Взаимодействие с Activity

Можно обращаться к фрагментам из Activity и наоборот.

У фрагмента нет метода findViewById для поиска компонентов с экрана. Поэтому вызывать этот метод нужно для View, которое будет содержимым фрагмента.

public View onCreateView () View v = inflater.inflate(R.layout.fragment1, null);

Button button = (Button) v.findViewById(R.id.button);

Доступ к фрагменту из Activity

Для этого у FragmentManager есть метод findFragmentById, который на вход принимает id компонента fragment (если фрагмент статический) или id контейнера (если динамический).

Fragment frag1 = getFragmentManager().findFragmentById(R.id.fragment1);

((TextView) frag1.getView().findViewById(R.id.textView)).setText("Access to Fragment 1 from Activity");

Доступ к Activity из фрагмента

Для этого фрагмент имеет метод getActivity.

((Button)getActivity().findViewById(R.id.btnFind)).setText("Access from Fragment1");

Обработка в Activity события из фрагмента

Например, в Activity есть два фрагмента.

Первый – список заголовков статей. Второй – отображает содержимое статьи, выбранной в первом.

Activity должна при выборе определенной статьи в первом, отобразить информацию об этой статье во втором фрагменте.

Фрагмент – обособленный модуль, он не должен искать второй фрагмент и работать с ним, этим должен заниматься Activity. Фрагмент должен просто проинформировать Activity, что выбрана статья такая-то.

Лучший способ тут – это использовать интерфейс, который мы опишем в фрагменте и который затем будет реализован в Activity.

Пример: http://startandroid.ru/ru/uroki/vse-uroki-spiskom/176-urok-106-android-3-fragments-vzaimodejstvie-s-activity.html