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, али додаје сопствене колбекове: 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 је 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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође