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.