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 библиотека с обратна съвместимост до API 4.
Според данни на Google (2026), 80% от приложенията в Google Play използват Fragment в една или друга форма. Jetpack Fragment библиотеката е изтеглена над 10 милиарда пъти чрез Google Play Services. Fragment остава ключов компонент на Android архитектурата дори в ерата на Jetpack Compose.
Жизненият цикъл на Fragment е по-сложен от този на Activity, тъй като зависи от състоянието на хост Activity. Fragment преминава през същите състояния като Activity, но добавя свои собствени callback-и: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.
| Fragment callback | Съответствие на 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-то е type-safe, използва Bundle и не изисква познаване на получателя. Parent FragmentManager действа като посредник между фрагментите.
Изборът между Fragment и Activity зависи от архитектурата на приложението. Fragment е задължителен за адаптивни layout-и (телефон + таблет), за персонализирана анимация на преходи и за използване на 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 за type-safe прехвърляне на данни.
Jetpack Fragment библиотеката (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 — когато екранът се състои от няколко независими блока (табове, master-detail, адаптация за таблет). 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също