0Pricing
Android Academy · Урок

Фрагменты

Создавайте модульные интерфейсы с помощью Fragments. Изучите жизненный цикл фрагментов, ViewBinding во фрагментах, передачу аргументов, управление стеком возврата и взаимодействие фрагментов с Activity.

«Фрагменты» — бесплатный урок Android Academy на CoddyKit. Это урок 6 из 7. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 7 уроков всего.

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

Фрагмент — это повторно используемый модуль интерфейса, размещённый внутри Activity. Представьте его как подчинённую Activity со своей разметкой, жизненным циклом и логикой.

Зачем использовать фрагменты?

  • Повторно использовать интерфейс в нескольких Activity
  • Поддерживать разные разметки для телефона и планшета
  • Создавать сценарии с несколькими экранами без множества Activity
  • Естественно работать с Navigation Component

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

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

  • onAttach — фрагмент присоединён к Activity
  • onCreate — фрагмент создан (представления ещё нет)
  • onCreateView — разворачивается разметка
  • onViewCreated — представление готово, здесь настраивается интерфейс
  • onDestroyView — представление уничтожено (ссылки на представления нужно очистить)
  • onDetach — фрагмент отсоединён

Создание фрагмента

Создайте класс, расширяющий Fragment, и переопределите onCreateView, чтобы развернуть разметку:

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

class HomeFragment : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_home, container, false)
    }
}

ViewBinding во фрагментах

Используйте ViewBinding во фрагментах, но освобождайте привязку в onDestroyView, чтобы избежать утечек памяти:

class HomeFragment : Fragment() {

    private var _binding: FragmentHomeBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        _binding = FragmentHomeBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding.tvTitle.text = "Welcome!"
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null   // prevent memory leak
    }
}

XML-разметка фрагмента

Создайте res/layout/fragment_home.xml так же, как разметку Activity. Корневое представление становится представлением фрагмента:

<!-- res/layout/fragment_home.xml -->
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="24sp"
        android:text="Home" />

</LinearLayout>

Добавление фрагмента в Activity

Есть два способа добавить фрагмент в Activity:

  • Статический (XML) — объявить его в разметке с помощью тега <fragment>. Фиксируется во время выполнения.
  • Динамический (код) — использовать FragmentManager и транзакции. Можно заменять во время выполнения.
<!-- Static: in activity_main.xml -->
<fragment
    android:id="@+id/homeFragment"
    android:name="com.example.HomeFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Динамические транзакции фрагментов

Используйте supportFragmentManager, чтобы добавлять, заменять или удалять фрагменты во время выполнения:

// In Activity:
class MainActivity : AppCompatActivity(R.layout.activity_main) {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        if (savedInstanceState == null) {
            supportFragmentManager.beginTransaction()
                .add(R.id.fragmentContainer, HomeFragment())
                .commit()
        }
    }

    fun showDetail(id: Int) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.fragmentContainer, DetailFragment.newInstance(id))
            .addToBackStack(null)  // allow back navigation
            .commit()
    }
}

Передача аргументов фрагментам

Передавайте данные через Bundle, используя шаблон фабрики в сопутствующем объекте. Никогда не используйте конструктор фрагмента с параметрами: после изменений конфигурации Android создаёт фрагменты с конструктором без аргументов:

class DetailFragment : Fragment() {

    companion object {
        private const val ARG_ID = "item_id"

        fun newInstance(itemId: Int): DetailFragment {
            return DetailFragment().apply {
                arguments = Bundle().apply {
                    putInt(ARG_ID, itemId)
                }
            }
        }
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val itemId = requireArguments().getInt(ARG_ID)
        // use itemId to load data
    }
}

Взаимодействие фрагмента и Activity

Используйте интерфейс, определённый во фрагменте и реализованный Activity. Фрагмент получает ссылку через onAttach:

class ListFragment : Fragment() {

    interface OnItemSelected {
        fun onItemSelected(id: Int)
    }

    private var listener: OnItemSelected? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        listener = context as? OnItemSelected
    }

    private fun handleClick(id: Int) {
        listener?.onItemSelected(id)
    }

    override fun onDetach() {
        super.onDetach()
        listener = null
    }
}

Стек возврата

Если вызвать addToBackStack(null) в транзакции, нажатие кнопки «Назад» извлечёт фрагмент из стека:

  • Без addToBackStack — кнопка «Назад» закрывает Activity
  • С addToBackStack — кнопка «Назад» возвращает к предыдущему фрагменту
  • Для программного возврата используйте popBackStack()

Фрагмент в контейнере

В разметке Activity нужен только контейнер — обычно FrameLayout с ID. Фрагмент заполняет этот контейнер:

<!-- activity_main.xml -->
<FrameLayout
    android:id="@+id/fragmentContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

Быстрая проверка

Почему фрагменту нельзя передавать аргументы конструктора, а вместо этого следует использовать Bundle через фабрику в сопутствующем объекте?

Повторение: фрагменты

Фрагменты — строительные блоки современных интерфейсов Android:

  • Расширяйте Fragment и разворачивайте разметку в onCreateView
  • Настраивайте интерфейс в onViewCreated
  • Освобождайте ViewBinding в onDestroyView
  • Передавайте данные через Bundle и фабрику в сопутствующем объекте (newInstance)
  • Используйте addToBackStack для навигации назад
  • Взаимодействуйте с Activity через интерфейс

Далее: запрос опасных разрешений во время выполнения.

Часто задаваемые вопросы

Урок «Фрагменты» бесплатный?

Да — полный текст урока «Фрагменты» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 7 уроков всего.

Чему я научусь в уроке «Фрагменты»?

Создавайте модульные интерфейсы с помощью Fragments. Изучите жизненный цикл фрагментов, ViewBinding во фрагментах, передачу аргументов, управление стеком возврата и взаимодействие фрагментов с Activi… Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 6 из 7.

Сколько времени занимает урок «Фрагменты»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Структура проекта и манифест
  2. Активности и жизненный цикл
  3. Макеты и представления
  4. Обработка ввода пользователя
  5. Намерения и навигация
  6. Фрагменты
  7. Разрешения и запросы во время выполнения
← Назад к Android Academy