← Назад к вопросам

Что такое фрагменты?

2.3 Middle🔥 111 комментариев
#Жизненный цикл и навигация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое фрагменты в Android?

Фрагменты (Fragments) — это фундаментальный компонент архитектуры Android, представляющий собой модульную, повторно используемую часть пользовательского интерфейса (UI) и логики, которую можно внедрить в Activity (активность). Они были введены в API уровня 11 (Android 3.0 Honeycomb), прежде всего для поддержки более гибких и адаптивных пользовательских интерфейсов на устройствах с большими экранами (планшетах), а затем стали стандартом для всех приложений.

Проще говоря, фрагмент — это "мини-активность" или "суб-активность". Он имеет собственный жизненный цикл (lifecycle), который напрямую зависит от жизненного цикла хост-активности, свой макет (layout) и может реагировать на собственные события ввода. Ключевая идея — одна активность может управлять несколькими фрагментами одновременно, организуя UI в зависимости от конфигурации устройства (альбомная/портретная ориентация, размер экрана).

Основные цели и преимущества использования фрагментов

  • Модульность и повторное использование: Логику и UI отдельного экрана или функционального блока можно инкапсулировать во фрагмент и использовать в нескольких разных активностях. Например, фрагмент со списком товаров может быть использован в активности для планшета и в активности для телефона.
  • Адаптивность к разным размерам экранов: На планшете (широком экране) одна активность может отображать два фрагмента бок о бок (например, список деталей и детальная информация). На телефоне (узком экране) та же активность может показывать только один фрагмент за раз, переключаясь между ними.
  • Управление back stack (стеком возврата): Операции с фрагментами (добавление, замена) могут быть добавлены в back stack активности. Это позволяет пользователю возвращаться к предыдущему фрагменту по нажатию системной кнопки "Назад", обеспечивая навигацию внутри одной активности.
  • Более организованная архитектура: Разделение UI на фрагменты способствует соблюдению принципа единой ответственности (Single Responsibility Principle) и упрощает поддержку кода.

Жизненный цикл фрагмента

Жизненный цикл фрагмента сложнее, чем у активности, и тесно с ней связан. Основные состояния и обратные вызовы (callbacks):

Fragment Lifecycle (описательно)

  • onAttach(): Вызывается, когда фрагмент ассоциируется с его активностью.
  • onCreate(): Инициализация фрагмента (без UI).
  • onCreateView(): Создание и возврат иерархии View фрагмента (надувание макета). Это ключевой метод для отображения UI.
  • onViewCreated(): Вызывается сразу после onCreateView(). Здесь происходит окончательная настройка созданных View (например, установка адаптеров для RecyclerView).
  • onActivityCreated(): Уведомляет, что активность хост создана, и её View иерархия готова. (Устарел в новых API, часто используется onViewStateRestored()).
  • onStart(), onResume(), onPause(), onStop(): Аналогичны соответствующим методам активности, синхронизированы с ней.
  • onDestroyView(): Вызывается, когда иерархия View фрагмента уничтожается, но сам фрагмент продолжает существовать.
  • onDestroy(), onDetach(): Окончательное уничтожение фрагмента и разрыв связи с активностью.

Пример создания и использования фрагмента

Рассмотрим простейший пример фрагмента, отображающего текстовое сообщение.

1. Определение макета фрагмента (fragment_example.xml):

<?xml version="1.0" encoding="utf 8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Привет из фрагмента!" />

</FrameLayout>

2. Создание класса фрагмента (ExampleFragment.kt на Kotlin):

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment

class ExampleFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Надуваем макет для этого фрагмента
        return inflater.inflate(R.layout.fragment_example, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Настройка View, например, установка слушателей
        val textView = view.findViewById<TextView>(R.id.textView)
        textView.setOnClickListener {
            // Обработка клика внутри фрагмента
        }
    }
}

3. Добавление фрагмента в активность (через Layout XML или программно):

Через XML (activity_main.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ...>
    <!-- Контейнер для фрагмента -->
    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

Программно в активности (MainActivity.kt):

import androidx.fragment.app.commit

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Используем поддержку FragmentManager из AndroidX
        if (savedInstanceState == null) {
            supportFragmentManager.commit {
                setReorderingAllowed(true)
                // Замена контейнера на наш фрагмент
                replace<ExampleFragment>(R.id.fragment_container)
            }
        }
    }
}

Коммуникация между фрагментами и активностью

Прямое взаимодействие фрагментов друг с другом считается плохой практикой. Вместо этого рекомендуется:

  1. Через хост-активность: Фрагменты сообщают о событиях в активность (через интерфейсы обратного вызова или современные механизмы), а активность управляет другими фрагментами.
  2. Использование общего ViewModel: С появлением архитектурных компонентов ViewModel и LiveData / Flow, фрагменты, принадлежащие одной активности, могут обмениваться данными через общий экземпляр ViewModel, что обеспечивает чистую декoupled архитектуру.
  3. Использование результата (Fragment Result API): Современный API для передачи данных между фрагментами через их FragmentManager, без прямых ссылок.

Важные современные практики

  • Всегда используйте библиотеку AndroidX (androidx.fragment.app.Fragment) вместо устаревшей Support Library или Framework версии.
  • Управление фрагментами: Используйте FragmentManager и FragmentTransaction. Для навигации рекомендуется использовать компонент Navigation из Jetpack.
  • Избегайте утечек памяти: Не храните жесткие ссылки на контекст активности или её View. Используйте viewLifecycleOwner для наблюдения за LiveData/Flow внутри onViewCreated().
  • Восстановление состояния: Всегда учитывайте восстановление состояния после уничтожения активности (поворот экрана). Используйте savedInstanceState и ViewModel для сохранения критичных данных.

Таким образом, фрагменты — это мощный инструмент для создания гибких, модульных и адаптивных интерфейсов, ставший неотъемлемой частью современной разработки под Android, особенно в сочетании с другими компонентами Jetpack.

Что такое фрагменты? | PrepBro