Fragment: какво е това, фрагменти и FragmentManager в Android

Автор: IT Sectr Публикувано: 2026-02-22 Време за четене: 7 мин

Fragment — преизползваем UI компонент в Android, който се вгражда в Activity и се управлява чрез FragmentManager. Всеки фрагмент има собствен жизнен цикъл, layout и състояние. Fragment улеснява адаптацията към различни размери на екрана и повторното използване на код. Прочетете повече в официалното ръководство на Google.

Основни точки

  • Fragment — UI компонент вътре в Activity със собствен жизнен цикъл и layout
  • FragmentManager — клас за управление на транзакции на фрагменти и back stack
  • FragmentTransaction — атомарна операция за добавяне, замяна или премахване на фрагменти
  • Jetpack Fragment — библиотека за обратна съвместимост до Android 1.6 (API 4)
  • ViewModel — споделен компонент за обмен на данни между фрагменти в едно Activity

Какво е Fragment?

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

Жизненият цикъл на Fragment е по-сложен от този на Activity, тъй като зависи от състоянието на хост Activity. Fragment преминава през същите състояния като Activity, но добавя свои собствени callback-и: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.

Fragment callbackСъответствие на ActivityПредназначение
onAttachпреди onCreateFragment е прикрепен към Activity
onCreateonCreateИнициализация на данни, несвързани с UI
onCreateViewonCreateСъздаване на layout чрез inflater
onViewCreatedonCreateСвързване на UI елементи след създаване на view
onDestroyViewonDestroyПремахване на view, освобождаване на UI ресурси
onDetachonDestroyFragment е отделен от Activity

Сравнение на жизнения цикъл на Fragment и Activity

Основната разлика на жизнения цикъл на Fragment — извикването на onCreateView и onDestroyView между onCreate и onDestroy. Fragment може да съществува без UI (ако onCreateView връща null). След пресъздаване на Activity, FragmentManager автоматично възстановява фрагментите.

FragmentManager и транзакции

FragmentManager — централният клас за управление на фрагменти в Activity. Той отговаря за добавяне, премахване, замяна на фрагменти, управление на back stack и възстановяване на състояние. FragmentManager е достъпен чрез supportFragmentManager (AndroidX) или fragmentManager (стар API).

kotlin
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

Нека разгледаме ключовите методи на жизнения цикъл на Fragment с пример на Kotlin. onCreateView създава layout — за разлика от Activity, методът трябва да върне View. onViewCreated се извиква веднага след това, тук е безопасно да намирате елементи по id. onDestroyView — последният момент за почистване на референции към view.

kotlin
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 аргументи — за данни при създаване на фрагмент.

kotlin
// Споделен 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 vs Activity: кога какво да изберем

Изборът между Fragment и Activity зависи от архитектурата на приложението. Fragment е задължителен за адаптивни layout-и (телефон + таблет), за персонализирана анимация на преходи и за използване на Jetpack Navigation. Activity е за предпочитане за прости приложения с един-два екрана.

КритерийFragmentActivity
Скорост на създаванеПо-бърз (лек компонент)По-бавен (системен процес)
Повторно използванеВисоко (един фрагмент в различни Activity)Ниско (всеки екран — свое Activity)
Анимация на преходиГъвкава (FragmentTransaction)Ограничена (overridePendingTransition)
Запазване при завъртанеАвтоматично (мениджърът възстановява)Ръчно (onSaveInstanceState)
Deep LinksЧрез Navigation ComponentВградена поддръжка чрез intent-filter

Jetpack Fragment и Jetpack Navigation

Съвременният подход за работа с 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, а не директно.

xml

<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 — какво е това?

FragmentManager — клас, който управлява транзакции на фрагменти. Той добавя, премахва, заменя фрагменти в контейнера на Activity. FragmentManager възстановява състоянието на фрагментите при пресъздаване на Activity и управлява back stack.

Как Fragment се различава от Activity?

Fragment — част от UI вътре в Activity, не може да съществува самостоятелно. Fragment оцелява при пресъздаване на Activity при завъртане на екрана. Activity — пълноценен екран със собствен Lifecycle, Fragment зависи от Lifecycle на Activity.

Кога да използваме Fragment вместо Activity?

Fragment — когато екранът се състои от няколко независими блока (табове, master-detail, адаптация за таблет). Activity — когато екранът няма повтарящи се блокове. Google препоръчва Single Activity + множество Fragment.

Как да прехвърлим данни между Fragment?

Три начина: чрез родителско Activity (споделен ViewModel), чрез Fragment Result API (setFragmentResult), чрез Bundle аргументи при създаване на Fragment. ViewModel — предпочитаният начин, тъй като данните се запазват при пресъздаване.

Какво е Fragment Transaction?

Fragment Transaction — атомарна операция за промяна на набора от фрагменти. FragmentManager.beginTransaction() отваря транзакция, в която могат да се извикат add, remove, replace, hide, show. Всяка транзакция завършва с commit() или commitNow().

Резюме

  • Fragment — преизползваем UI компонент вътре в Activity със собствен жизнен цикъл, layout и състояние
  • FragmentManager управлява транзакции на фрагменти и възстановява тяхното състояние при пресъздаване на Activity
  • FragmentTransaction — атомарна операция за добавяне, замяна, премахване и скриване на фрагменти
  • Жизненият цикъл на Fragment включва шест callback-и, от onAttach до onDetach, с допълнителна точка onCreateView
  • ViewModel — препоръчителен начин за обмен на данни между фрагменти в едно Activity
  • Fragment Result API осигурява type-safe прехвърляне на еднократни събития между фрагменти

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също