Фрагменты
Создавайте модульные интерфейсы с помощью Fragments. Изучите жизненный цикл фрагментов, ViewBinding во фрагментах, передачу аргументов, управление стеком возврата и взаимодействие фрагментов с Activity.
«Фрагменты» — бесплатный урок Android Academy на CoddyKit. Это урок 6 из 7. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 7 уроков всего.
Что такое фрагменты?
Фрагмент — это повторно используемый модуль интерфейса, размещённый внутри Activity. Представьте его как подчинённую Activity со своей разметкой, жизненным циклом и логикой.
Зачем использовать фрагменты?
- Повторно использовать интерфейс в нескольких Activity
- Поддерживать разные разметки для телефона и планшета
- Создавать сценарии с несколькими экранами без множества Activity
- Естественно работать с Navigation Component
Жизненный цикл фрагмента
У фрагментов есть собственный жизненный цикл, который протекает одновременно с жизненным циклом Activity. Основные обратные вызовы:
onAttach— фрагмент присоединён к ActivityonCreate— фрагмент создан (представления ещё нет)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 — локальная установка не требуется.
Все уроки этого курса
- Структура проекта и манифест
- Активности и жизненный цикл
- Макеты и представления
- Обработка ввода пользователя
- Намерения и навигация
- Фрагменты
- Разрешения и запросы во время выполнения