Fragment — переиспользуемый компонент UI в Android, который встраивается в Activity и управляется через FragmentManager. Каждый фрагмент имеет собственный жизненный цикл, layout и состояние. Fragment упрощает адаптацию под разные размеры экрана и повторное использование кода. Подробнее читайте в официальном руководстве Google.
Главное
Fragment — модульный компонент пользовательского интерфейса Android, который представляет часть экрана внутри Activity. Fragment может управлять собственным layout, обрабатывать события жизненного цикла и сохранять своё состояние. Благодаря модульности один фрагмент можно использовать в разных Activity и на разных устройствах.
Fragment API появился в Android 3.0 (Honeycomb, API 11) 2011 года для поддержки планшетов. До этого разработчикам приходилось создавать отдельные Activity для телефона и планшета. Fragment позволил собирать экран из независимых блоков. В 2019 году Google выпустила Jetpack Fragment library с обратной совместимостью до API 4.
По данным Google (2026), 80% приложений в Google Play используют Fragment в той или иной форме. Jetpack Fragment library загружена более 10 миллиардов раз через Google Play Services. Fragment остаётся ключевым компонентом Android-архитектуры даже в эпоху Jetpack Compose.
Жизненный цикл Fragment сложнее, чем у Activity, поскольку он зависит от состояния Activity-хоста. Fragment проходит через те же состояния, что и Activity, но добавляет собственные колбэки: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.
| Колбэк Fragment | Соответствие Activity | Назначение |
|---|---|---|
| onAttach | до onCreate | Fragment привязан к Activity |
| onCreate | onCreate | Инициализация данных, не связанных с UI |
| onCreateView | onCreate | Создание layout через inflater |
| onViewCreated | onCreate | Связывание элементов UI после создания view |
| onDestroyView | onDestroy | Удаление view, освобождение ресурсов UI |
| onDetach | onDestroy | Fragment отвязан от Activity |
Главное отличие жизненного цикла Fragment — вызов onCreateView и onDestroyView между onCreate и onDestroy. Fragment может существовать без UI (если onCreateView возвращает null). После пересоздания Activity FragmentManager восстанавливает фрагменты автоматически.
FragmentManager — центральный класс для управления фрагментами в Activity. Он отвечает за добавление, удаление, замену фрагментов, управление back stack и восстановление состояния. FragmentManager доступен через supportFragmentManager (AndroidX) или fragmentManager (старый API).
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Если фрагмент ещё не добавлен — создаём
if (savedInstanceState == null) {
val transaction = this.supportFragmentManager
.beginTransaction()
transaction.add(R.id.fragment_container, ListFragment())
transaction.addToBackStack(null)
transaction.commit()
}
}
fun replaceFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(null)
.commit()
}
}Транзакции FragmentTransaction — атомарны. commit() планирует выполнение на следующий цикл Looper. Для немедленного выполнения используйте commitNow(). addToBackStack(null) добавляет транзакцию в стек назад — кнопка «Назад» отменит операцию.
Рассмотрим ключевые методы жизненного цикла Fragment с примером на Kotlin. onCreateView создаёт layout — в отличие от Activity метод должен вернуть View. onViewCreated вызывается сразу после, здесь безопасно находить элементы по id. onDestroyView — последний момент для очистки ссылок на view.
class DetailFragment : Fragment() {
private var _binding: FragmentDetailBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = FragmentDetailBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.textTitle.setText("Детали")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}Паттерн View Binding с _binding/binding гарантирует, что после onDestroyView ссылка на layout обнуляется. Обращение к binding после уничтожения view вызовет NullPointerException. Этот паттерн рекомендован Google для всех фрагментов.
Для передачи данных между фрагментами Android предлагает несколько механизмов. Самый надёжный — общий ViewModel, разделяемый между фрагментами одного Activity. Fragment Result API подходит для разовых событий. Аргументы Bundle — для данных при создании фрагмента.
// Общий ViewModel для двух фрагментов
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// Фрагмент A: отправляет событие через Fragment Result API
setFragmentResult("request_key", bundleOf("key" to "value"))
// Фрагмент B: получает событие
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (добавлен в Fragment 1.3.0) заменяет устаревшие setTargetFragment/onActivityResult. API типобезопасен, использует Bundle и не требует знания о получателе. Parent FragmentManager выступает посредником между фрагментами.
Выбор между Fragment и Activity зависит от архитектуры приложения. Fragment обязателен для адаптивных макетов (телефон + планшет), для кастомной анимации переходов и для использования Jetpack Navigation. Activity предпочтительнее для простых приложений с одним-двумя экранами.
| Критерий | Fragment | Activity |
|---|---|---|
| Скорость создания | Быстрее (лёгкий компонент) | Медленнее (системный процесс) |
| Повторное использование | Высокое (один фрагмент в разных Activity) | Низкое (каждый экран — своё Activity) |
| Анимация переходов | Гибкая (FragmentTransaction) | Ограниченная (overridePendingTransition) |
| Сохранение при повороте | Автоматическое (менеджер восстанавливает) | Ручное (onSaveInstanceState) |
| Deep Links | Через Navigation Component | Нативная поддержка через intent-filter |
Современный подход к работе с Fragment — Jetpack Navigation Component, который заменяет ручное управление FragmentManager. Библиотека предоставляет NavGraph (XML-граф навигации), NavHostFragment и Safe Args для типобезопасной передачи данных.
Jetpack Fragment library (androidx.fragment:fragment-ktx) включает FragmentResult API, DialogFragment, BottomSheetDialogFragment и интеграцию с Lifecycle-aware компонентами. С 2026 года Google рекомендует использовать Fragment только через Jetpack Navigation, а не напрямую.
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:startDestination="@+id/listFragment">
<fragment
android:id="@+id/listFragment"
android:name=".ListFragment"
android:label="Список">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="Детали" />
</navigation>Часто задаваемые вопросы
FragmentManager — класс, управляющий транзакциями фрагментов. Он добавляет, удаляет, заменяет фрагменты в контейнере Activity. FragmentManager восстанавливает состояние фрагментов при пересоздании Activity и управляет back stack.
Fragment — часть UI внутри Activity, не может существовать самостоятельно. Fragment переживает пересоздание Activity при повороте экрана. Activity — полноценный экран с собственным Lifecycle, Fragment зависит от Lifecycle Activity.
Fragment — когда экран состоит из нескольких независимых блоков (табс, мастер-детейл, адаптация под планшет). Activity — когда экран не имеет повторяющихся блоков. Google рекомендует Single Activity + множество Fragment.
Три способа: через родительское Activity (общий ViewModel), через Fragment Result API (setFragmentResult), через аргументы Bundle при создании Fragment. ViewModel — предпочтительный способ, так как данные сохраняются при пересоздании.
Fragment Transaction — атомарная операция изменения набора фрагментов. FragmentManager.beginTransaction() открывает транзакцию, в которой можно вызвать add, remove, replace, hide, show. Каждая транзакция завершается commit() или commitNow().
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также