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 |
|---|---|---|
| Швидкість створення | Швидше (легкий компонент) | Повільніше (системний процес) |
| Повторне використання | Високе (один Fragment в різних 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також