Geçmişten Günümüze Android’de Navigasyon Yönetimi

Cihad Gökçe
inventiv
Published in
5 min readJan 19, 2023
https://inventionland.com/blog/evolution-of-navigation-systems

1. Navigasyon Yönetimi Nedir

Navigasyon; ekran bileşenleri arasındaki geçişi ve veri transferini sağlar. Navigasyon yönetimi ise ilgili ekranların bağlantısının doğru kurgulanmasıdır.

Navigasyon yönetimini daha iyi anlayabilmek için, bilinmesi gereken bazı kavramlar vardır.

Bunları şu şekilde sıralayabiliriz:

a. Bilinmesi Gereken Kavramlar

Activity

Uygulamadaki kullanıcı arayüzü ve etkileşimi için kullanılan temel bileşenlerden biridir. Daha iyi anlaşılması adına uygulamadaki ekranlardır.

Fragment

Activity içerisinde kullanıcı ara biriminin bir bölümünü temsil eden bileşendir. Ekranların modüler olabilmesini sağlarlar. Fragment’lar bir arada kullanılabildiği gibi tekrar kullanılmaya da uygundurlar. Ayrıca kendilerine özgü yaşam döngüleri vardır.

https://developer.android.com/guide/fragments

Fragment Manager

Fragment’larin eklenmesi, silinmesi, değiştirilmesi gibi yönetimsel işlerin yapıldığı bileşendir. Fragment’lar arasındaki navigasyonun en önemli bileşenidir.

Lifecycle (Yaşam Döngüsü)

Uygulamada bir ekranın görünme durumuna bağlı olarak belirli bir yaşam döngüsü vardır. Bu yaşam döngüsü ekrandaki işlemlerin ne zaman yapılacağı ile alakalı kararın verildiği yerdir. Activity ve Fragment için ayrı ayrı yaşam döngüleri vardır.

Activity LifeCycle — https://developer.android.com/guide/components/activities/activity-lifecycle
Fragment LifeCycle — https://developer.android.com/guide/fragments/lifecycle

Task

Kullanıcının uygulama olarak tecrübe ettiği, ilişkili Activity’ler bütünüdür. Activity’nin BackStack yönetimini, Task gerçekleştirir.

BackStack

Ekran bileşenlerinin geri gelme durumlarını yöneten bir yapıdır. Fragment’de BackStack yönetimini FragmentManager üstlenir, Activity’de BackStack yönetimini ise Task üstlenir. Main Activity’den geri gelindiğinde Task sonlandırılır.

https://innovationm.co/fragment-object-states-fragment-transactions-fragment-backstack

İntent

Activity’ler arasında geçişte köprü görevi görür. Intent’ler üzerinden yeni Activity’ler başlatılabilir ve veri gönderilebilir.

Yukarı bahsettiğimiz bileşenler yardımı ile Android uygulamasında Navigasyon işlemi gerçekleştirilir. Bu genel bilgi ışığında kod tarafındaki implemantasyon yöntemlerinin bazılarını ele alalım.

https://www.crossleaf.ca/ux-ui-design/

2. Navigasyon Yöntemleri

a. Native Navigation

Android’in temel kütüphaneleri ile uygulamadaki navigasyon yönetilebilir. Activity ve Fragment için iki farklı yönetim şekli mevcuttur.

  • Activity’ler arası geçiş için “startActivity” metodu kullanılır ve geçiş yapılacak activity ile bağlantı Intent üzerinden kurulur. Intent üzerinden putExtra metodu ile yeni Activity’e data iletilebilir. Activity değiştiğinde bir önceki Activity otomatik olarak Task içinde Stack’te tutulur. Geri gelme durumunda sırası ile Activity’ler Stack’ten çıkarılır ve bir alttaki Activity ekranda gösterilir.

Kod örneği :

startActivity(
Intent(requireActivity(), DashboardActivity::class.java).apply {
putExtra("DashboardType", 1)
}
)
  • Fragment’lar arasındaki navigasyon için ise FragmentManager ve FragmentTransaction sınıfları kullanılır. FragmentManager, Activity üzerindeki Task gibi Fragment’ların Stack olarak saklanmasını sağlar. FragmentTransaction ise geçiş için kullanılan özel bir sınıftır. Bu sınıf ile navigasyon geçiş parametreleri (örnek : animasyonlar, Backstack’e eklenip eklenmeyeceği, transaction tipi) ayarlanabilir. Fragment’lar için iki adet geçiş tipi mevcuttur. İlki “add” tipi ile; üzerine eklemek şeklinde bir geçiş yapılabilir. Diğeri ise “replace” ile; ilgili Fragment’ın birinin yerine diğerini göstermek ile yapılır. Her iki metodda da geçişin gerçekleşeceği container view ve geçiş yapılacak Fragment ile bundle objesi üzerinde iletilmek istenen parametreler tanımlanır. Geçişi başlatmak için ise commit metodu kullanılır.
https://stackoverflow.com/questions/18634207/difference-between-add-replace-and-addtobackstack

Kod örneği :

val transaction = requireFragmentManager().beginTransaction()
transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)

val newFragment = DashboardFragment().apply {
arguments = Bundle().apply { putInt("DashboardParameter", 1) }
}

transaction.replace(R.id.container, newFragment)
transaction.addToBackStack("MyFragment")
transaction.commit()

b. 3.Party Kütüphane Örneği FragNav

Fragment’lar arası navigasyon yönetimini kolaylaştırmak için geliştirilmiş bir kütüphanedir. Özellikle BottomNavigationView kullanılan uygulamalar gibi çoklu Stack tutulması gereken yapılarda avantaj sağlar.

FragNavController” ile yönetim işlemlerini bir sınıf üzerinde toplamıştır.

  • switchTab” metodu ile sekmeler arası geçiş yönetimi yapılır.
  • pushFragment” metodu ile yeni Fragment gösterimi yapılır.
  • popFragment” metodu ile Backstack üzerinden derinlik bazlı Fragment silme işlemi yapılır.

Kütüphanenin çalışma şekli örneği :

https://github.com/ncapdevi/FragNav

c. JetPack Navigation Component

Uygulamanın akışını ve veri transferini ekranda Navigation Graph ile gösteren ve tutarlı şekilde geçişleri yapmamıza olanak sağlayan bir navigasyon yöntemidir. Ayrıca geri gelme işlemi, veri taşıma ve animasyon gibi konularda da işimizi oldukça kolaylaştırır.

Sayfalarımızın ihtiyaç duyduğu verileri Navigation Graph üzerinden Safe Args ile iletebiliriz.

Navigation Component; NavigationGraph, NavHost, NavController olmak üzere üç temel bileşenden oluşur.

  • NavigationGraph ekranların ve geçişlerin içinde olduğu bir xml dosyasıdır.
https://android-developers.googleblog.com/2020/07/whats-new-in-navigation-2020.html
  • NavHost uygulamadaki ekranların içinde barındığı ortamdır. SingleActivity-MultiFragment yapısı için Activity olarak düşünülebilir.
  • NavController ise NavigationGraph içerisinde bulunan ekranlar arası geçişleri yapmayı ve yönetmeyi sağlar.

d. JetPack Compose Navigation

JetPack Compose teknolojisi ile xml ve Fragment bağımlılığı olmadan kullanıcı arayüzü geliştirilmektedir. Bu sebeple navigasyon yönetimi de yeni bir yaklaşım ile ele alınmaktadır. Artık navigasyon işlemleri composable fonksiyonlar arasında gerçekleşmektedir.

JetPack Compose Navigation yapabilmek için; composable “NavHost() fonksiyonu ile navigasyon için hedefler tayin edilir.

NavController navigasyon yönetiminin yapıldığı bileşendir. Üzerindeki navigate methodu sayesinde composable geçişler sağlanır.

Kod örneği :

val navController = rememberNavController()
NavHost(navController = navController, startDestination = "profile") {
composable("profile") { Profile(/*...*/) }
composable("friendslist") { FriendsList(/*...*/) }
/*...*/
}

3. Sonuç

Yukarıda bahsedilen yöntemler, süreç içinde evrilmiştir. Her birisinin kendi kullanım alanı halen mevcuttur. Fakat kullanım kolaylığı ve geliştirme süresi açısından JetPack Navigation Component ve JetPack Compose Navigation ön plana çıkmaktadır.

Tüm yöntemlerin avantajları ve dezavantajları aşağıda listelenmiştir:

  • Native Navigation herhangi bir ek kütüphane ihtiyaç duymadan navigasyon yönetimi sağlar. Android’in tüm versiyonlarında kullanıma uygundur. Navigasyon mantığının anlaşılması adına temel bir yapıdır. Dezavantajı ise kod yönetimi zordur ve çoklu navigasyon için elverişli değildir.
  • FragNav native navigasyonun daha kolay yönetilmesini sağlar. Fakat uygulama içinde navigasyonu görselleştirmez.
  • JetPack Navigation Component google tarafından resmi olarak tavsiye edilen navigasyon yöntemidir. Sayfalar arasındaki geçişleri grafik üzerinde görselleştirir. Ekranlar arası veri transferinde data güvenliğini sağlar. Ancak diğerlerine göre öğrenme süresi biraz daha fazla olabilir.
  • JetPack Compose Navigation JetPack Navigation Component’in declarative tasarıma göre özelleştirilmiş halidir. Xml bağımlılığı bulunmamaktadır. Yalnız grafik arayüze sahip değildir.

--

--