← Ana Sayfaya Dön

Andoridde Fragment, Navigation ve Arguments Kullanımı

Kategori: Android31 Ocak 2025

Fragment

  • Fragment, Android'de ekranlar arası geçişleri sağlayan bir yapıdır. Fragmentler Aktivitelerin içinde yaşarlar.

  • Aktivitelerden daha küçük ve verimli bir yapıdır.

  • Aktiviteleri birden fazla fragment ile daha küçük parçalara bölerek daha verimli bir şekilde kullanabiliriz

  • Örneğin 10 tane ekranı olan bir uygulamada 1 aktivite 10 fragment de yapabiliriz 2 aktivite 5 fragment de yapabiliriz.

İlk olarak fragment, navigation ve argumentler için gerekli safe arguments gradle modüllerini ekleyelim.

build.gradele.kts dosyasındaki pluginsin içine aşağıdaki kodu ekleyelim. (Proje klasörüne, module değil.)

id ("androidx.navigation.safeargs.kotlin") version "2.8.6" apply false

Ardından da app klasöründe pluginsin içine aşağıdaki kodu ekleyelim.

id ("kotlin-kapt") id ("androidx.navigation.safeargs.kotlin")

Sonrasına da yine app klasöründe dependenciesin` içine aşağıdaki kodu ekleyelim.

val nav_version = "2.8.6" implementation("androidx.navigation:navigation-fragment-ktx:$nav_version") implementation("androidx.navigation:navigation-ui-ktx:$nav_version")

Bunun yerine Android Studio şunu öneriyor, eski versiyonu yok ise uygulamanın bu kullanılabilir:

implementation(libs.androidx.navigation.fragment.ktx) implementation(libs.androidx.navigation.ui.ktx)

Fragment Oluşturma ve Navigation Component Kullanımı

Öncelikle fragmentleri activity oluşturduğumuz yerin altından boş bir fragment olarak BirinciFragment ve IkinciFragment adında oluşturuyoruz.

Daha sonra fragmentlerin layoutlarını oluşturuyoruz.

Blog Resmi

Şimdi oluşturduğumuz bu fragmentleri navigation component ile bağlayacağız.

  • Navigation Component, Android Jetpack'in bir parçasıdır.

Not: Andorid Jetpack, modern android geliştirme için geliştirilmiş toplu bir kütüphanedir. Buna fragmentler de dahildir, navigationlar da dahildir vs vs.

Şimdi bu işi yapmak için res klasöründe yeni bir android source file açıp nav_graph.xml klasörünü oluşturuyoruz. Kaynak tipini Navigation seçiyoruz.

Blog Resmi

Fragmentin birinden diğerine geçiş için bağlantı okunu bu şekilde oluşturuyoruz.

  • Kırmızı kutudaki ev işareti başlangıç noktasını belirlemek için kullanılır.

Fragmentlerin Kotlin Kısmı

Fragmentlerin viewBinding oluşturma şekli aktivitelere göre biraz farklıdır.

Öncelikle fragmentlerin içindeki gereksiz fonksiyonları kaldırıyoruz.

class BirinciFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_blank, container, false) } }

Şimdi gerekli binding kodlarını ekleyelim.

private var _binding : FragmentBirinciBinding ?= null private val binding get() = _binding!!

Bunları en başa eklemeliyiz, sonrasında onCreateView fonksiyonunda binding yapmayı unutmuyoruz.

override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { //burada binding işlemini yapıyoruz. _binding = FragmentBirinciBinding.inflate(inflater, container, false) val view = binding.root return view }

Şimdi onViewCreated fonksiyonunu override etmeyi unutmamalıyız, gerekli işlem kodlarını da ekleyelim:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.editText.setText(" ") binding.button.setOnClickListener { sonraki(it) // onClick ile sonraki() fonksiyonuna bağlamayıp bura yazabilirdik buton kodlarını } //activity veya app context veremiyoruz, fragmen içindeyiz, requirecontext yapmamız lazım Toast.makeText(requireContext(),"Hoşgeldiniz!",Toast.LENGTH_LONG).show() }

Fragment kullandığımız için Toast mesajı kısmında app veya activity context veremiyor, this falan kullanamıyoruz. Bunun yerine requireContext() kullanmalıyız.

BirinciFragment sayfasında son olarak onDestroyView fonksiyonunu override etmeyi unutmamalıyız.

override fun onDestroyView() { super.onDestroyView() _binding = null }

Argument Kullanımı

KullaniciIsmi adında bir argüman oluşturuyoruz, hangi fragmentte oluşturmak istiyorsak ona tıklayıp argüman oluştur diyoruz.

Blog Resmi

BirinciFragment sayfasındaki buton kodunu şu şekilde yazıyoruz.

// Butonumuzun onClick özelliğini bağladığımız fonksiyon fun sonraki (view : View){ //yazı paslamak için aşağıdaki satır ve isim parametresini ekledik val isim = binding.editText.text.toString() // Action oluşturarak navigation işlemi ile sayfalar arasında geçiş yapıyoruz. val action = BirinciFragmentDirections.actionBirinciFragmentToIkinciFragment(isim) Navigation.findNavController(view).navigate(action) }

BirinciFragmentDirections.actionBirinciFragmentToIkinciFragment kısmını biz ok çizince falan Android Studio otomatik oluşturuyor.

IkinciFragment sayfasında da aşağıdaki kodu ekleyelim.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) arguments?.let { val isim = IkinciFragmentArgs.fromBundle(it).kullaniciIsmi binding.gelenIsim.text= isim // İlk fragmentteki editText'in içinden aldığımız yazıyı ikinci fragmentteki textView'e bağlıyoruz. } }

arguments?.let { } ile argümanın null olup olmadığını kontrol ederek alıyoruz. fromBundle(it) ile nereden aldığımızı belirtiyoruz.

Şimdi kodun uygulanmasını görelim.

Blog Resmi

Uygulama başarılı bir şekilde çalışıyor. Birinci fragment sayfasında EditText'e bir değer yazıp butona tıkladığımızda bu metin ikinci fragment sayfasında yazdırılıyor.

Yaşam Döngüsü Farkları

Aktivite Yaşam Döngüsü

  • onCreate(): Activity arka planda oluşturulur.
  • onStart(): Kullanıcının göreceği şekilde uygulama başlatılır.
  • onResume(): Kullanıcı uygulamayla etkileşime geçebilir.
  • onPause(): Başka bir ekrana geçildiğinde çağrılır. Örnek, sekme sayfası.
  • onStop(): Başka bir ekran açıldığında çağrılır. Örnek, ana ekrana döndüğümüzde.
  • onDestroy(): Activity kaldırıldığında çağrılır, uygulama kapandığında yani.

Fragment Yaşam Döngüsü

  • onAttach(): Fragment, Activity'ye bağlanır.
  • onCreate(): Fragment oluşturulur.
  • onCreateView(): UI bileşenleri oluşturulur.
  • onViewCreated(): View işlemleri burada yapılır.
  • onStart(): Kullanıcının göreceği şekilde uygulama başlatılır.
  • onResume(): Kullanıcı uygulamayla etkileşime geçebilir.
  • onPause(): Başka bir ekrana geçildiğinde çağrılır. Örnek, sekme sayfası.
  • onStop(): Başka bir ekran açıldığında çağrılır. Örnek, ana ekrana döndüğümüzde.
  • onDestroyView(): View yok edilir, ancak Fragment hala vardır.
  • onDestroy(): Fragment kaldırıldığında çağrılır.
  • onDetach(): Activity ile bağlantısı kesilir.

Temel Farkları

  • Activity tüm ekranı yönetir, Fragment bir Activity içinde çalışır.
  • Fragment'in onCreateView() ve onViewCreated() gibi ekstra aşamaları vardır çünkü UI bileşenleri dinamik olarak oluşturulur.
  • Fragment, Activity’den bağımsız olarak var olabilir ve yeniden kullanılabilir.
  • Activity yaşam döngüsü tüm uygulamayı ilgilendirirken, Fragment yaşam döngüsü Activity’ye bağlıdır ve daha esnektir.

Neden Önemli?

override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.editText.setHint(" İsminizi giriniz") }

Eğer biz bu kodu onViewCreated fonksiyonunda yazarsak, fragment oluşturulduğunda çağrılır.

Ancak biz bu kodu onCreate fonksiyonunda yazmış olsaydık, uygulama ve aktivite başladığında çağrılacaktı. Fakat ortada henüz fragmentler için view yoktur. Bu yüzden ya hata alırız ya da istediğimiz işlemi yapamayız.