Fragment, Android'de bir Activity içine gömülen ve FragmentManager aracılığıyla yönetilen yeniden kullanılabilir bir UI bileşenidir. Her fragmentin kendi yaşam döngüsü, layout ve durumu vardır. Fragment, farklı ekran boyutlarına uyum sağlamayı ve kodun yeniden kullanımını basitleştirir. Daha fazlasını Google'ın resmi kılavuzunda okuyun.
Önemli Noktalar
Fragment, bir Activity içinde ekranın bir bölümünü temsil eden modüler bir Android kullanıcı arayüzü bileşenidir. Fragment, kendi layout'unu yönetebilir, yaşam döngüsü olaylarını işleyebilir ve durumunu kaydedebilir. Modülerlik sayesinde, bir fragment farklı Activity'lerde ve farklı cihazlarda kullanılabilir.
Fragment API, tabletleri desteklemek için 2011 yılında Android 3.0'da (Honeycomb, API 11) ortaya çıktı. Bundan önce geliştiricilerin telefon ve tablet için ayrı Activity'ler oluşturması gerekiyordu. Fragment, bağımsız bloklardan bir ekran oluşturmayı mümkün kıldı. 2019'da Google, API 4'e kadar geriye dönük uyumlulukla Jetpack Fragment kütüphanesini yayınladı.
Google'a (2026) göre, Google Play'deki uygulamaların %80'i bir şekilde Fragment kullanıyor. Jetpack Fragment kütüphanesi, Google Play Services aracılığıyla 10 milyar kez indirildi. Fragment, Jetpack Compose çağında bile Android mimarisinin temel bir bileşeni olmaya devam ediyor.
Fragment'in yaşam döngüsü, Activity'ninkinden daha karmaşıktır çünkü ana Activity'nin durumuna bağlıdır. Fragment, Activity ile aynı durumlardan geçer ancak kendi callback'lerini ekler: onAttach, onCreateView, onViewCreated, onActivityCreated, onDestroyView, onDetach.
| Fragment Callback | Activity Karşılığı | Amaç |
|---|---|---|
| onAttach | onCreate'ten önce | Fragment Activity'ye eklendi |
| onCreate | onCreate | UI dışı verilerin başlatılması |
| onCreateView | onCreate | Inflater aracılığıyla layout oluşturma |
| onViewCreated | onCreate | View oluşturulduktan sonra UI öğelerini bağlama |
| onDestroyView | onDestroy | View'i kaldırma, UI kaynaklarını serbest bırakma |
| onDetach | onDestroy | Fragment Activity'den ayrıldı |
Fragment yaşam döngüsünün temel farkı, onCreate ve onDestroy arasında onCreateView ve onDestroyView'in çağrılmasıdır. Fragment, UI olmadan var olabilir (onCreateView null döndürürse). Activity yeniden oluşturulduktan sonra FragmentManager, fragmentleri otomatik olarak geri yükler.
FragmentManager, bir Activity'de fragmentleri yönetmek için merkezi sınıftır. Fragment ekleme, kaldırma, değiştirme, geri yığınını yönetme ve durumu geri yüklemeden sorumludur. FragmentManager'a supportFragmentManager (AndroidX) veya fragmentManager (eski API) aracılığıyla erişilebilir.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Fragment henüz eklenmedi — oluşturuluyor
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 işlemleri atomiktir. commit() yürütmeyi bir sonraki Looper döngüsüne planlar. Anında yürütme için commitNow() kullanın. addToBackStack(null) işlemi geri yığınına ekler — geri butonu işlemi geri alır.
Fragment yaşam döngüsünün temel metotlarını bir Kotlin örneğiyle inceleyelim. onCreateView bir layout oluşturur — Activity'nin aksine, metot bir View döndürmelidir. onViewCreated hemen ardından çağrılır, burada id'ye göre öğe bulmak güvenlidir. onDestroyView, view referanslarını temizlemek için son andır.
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("Detaylar")
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
}View Binding deseni (_binding/binding ile), onDestroyView'den sonra layout referansının sıfırlanmasını sağlar. View yok edildikten sonra binding'e erişmek NullPointerException'a neden olur. Bu desen Google tarafından tüm fragmentler için önerilir.
Fragmentler arasında veri aktarımı için Android birkaç mekanizma sunar. En güveniliri, bir Activity'nin fragmentleri arasında paylaşılan bir ViewModel'dir. Fragment Result API, tek seferlik olaylar için uygundur. Bundle argümanları, fragment oluştururken veri içindir.
// İki fragment için paylaşılan ViewModel
class SharedViewModel : ViewModel() {
private val _selectedItem = MutableLiveData<Item>()
val selectedItem: LiveData<Item> = _selectedItem
fun select(item: Item) { _selectedItem.setValue(item) }
}
// Fragment A: Fragment Result API aracılığıyla olay gönderir
setFragmentResult("request_key", bundleOf("key" to "value"))
// Fragment B: olayı alır
childFragmentManager.setFragmentResultListener("request_key", this) { requestKey, bundle ->
val value = bundle.getString("key")
}Fragment Result API (Fragment 1.3.0'da eklendi), kullanımdan kaldırılan setTargetFragment/onActivityResult'ın yerini alır. API tip güvenlidir, Bundle kullanır ve alıcının bilinmesini gerektirmez. Parent FragmentManager, fragmentler arasında aracı görevi görür.
Fragment ve Activity arasındaki seçim, uygulama mimarisine bağlıdır. Fragment, uyarlanabilir düzenler (telefon + tablet), özel geçiş animasyonları ve Jetpack Navigation kullanımı için zorunludur. Activity, bir veya iki ekranlı basit uygulamalar için tercih edilir.
| Kriter | Fragment | Activity |
|---|---|---|
| Oluşturma hızı | Daha hızlı (hafif bileşen) | Daha yavaş (sistem işlemi) |
| Yeniden kullanılabilirlik | Yüksek (bir fragment farklı Activity'lerde) | Düşük (her ekranın kendi Activity'si) |
| Geçiş animasyonu | Esnek (FragmentTransaction) | Sınırlı (overridePendingTransition) |
| Döndürmede koruma | Otomatik (yönetici geri yükler) | Manuel (onSaveInstanceState) |
| Deep Links | Navigation Component aracılığıyla | intent-filter ile yerel destek |
Fragment ile çalışmanın modern yaklaşımı, manuel FragmentManager yönetiminin yerini alan Jetpack Navigation Component'tir. Kütüphane, NavGraph (XML navigasyon grafiği), NavHostFragment ve tip güvenli veri aktarımı için Safe Args sağlar.
Jetpack Fragment kütüphanesi (androidx.fragment:fragment-ktx), FragmentResult API, DialogFragment, BottomSheetDialogFragment ve Lifecycle-aware bileşenlerle entegrasyon içerir. 2026'dan itibaren Google, Fragment'in doğrudan değil yalnızca Jetpack Navigation aracılığıyla kullanılmasını önerir.
<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="Liste">
<action
android:id="@+id/action_list_to_detail"
app:destination="@+id/detailFragment" />
</fragment>
<fragment
android:id="@+id/detailFragment"
android:name=".DetailFragment"
android:label="Detaylar" />
</navigation>Sıkça Sorulan Sorular
FragmentManager, fragment işlemlerini yöneten bir sınıftır. Bir Activity kabında fragmentleri ekler, kaldırır ve değiştirir. FragmentManager, Activity yeniden oluşturulduğunda fragment durumunu geri yükler ve geri yığınını yönetir.
Fragment, bir Activity içindeki UI'nın bir parçasıdır, bağımsız olarak var olamaz. Fragment, ekran döndürme sırasında Activity'nin yeniden oluşturulmasından kurtulur. Activity, kendi Lifecycle'ına sahip tam bir ekrandır, Fragment, Activity'nin Lifecycle'ına bağlıdır.
Fragment — ekran birden çok bağımsız bloktan oluştuğunda (sekmeler, ana-ayrıntı, tablet uyarlaması). Activity — ekranda tekrarlanabilir blok olmadığında. Google, Single Activity + çoklu Fragment önerir.
Üç yol: üst Activity aracılığıyla (paylaşılan bir ViewModel), Fragment Result API (setFragmentResult) aracılığıyla, Fragment oluştururken Bundle argümanları aracılığıyla. ViewModel tercih edilen yöntemdir çünkü veriler yeniden oluşturma sırasında korunur.
Fragment Transaction, fragment kümesini değiştiren atomik bir işlemdir. FragmentManager.beginTransaction(), add, remove, replace, hide, show çağrılabilecek bir işlem açar. Her işlem commit() veya commitNow() ile biter.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun