Android Navigation Component İncelemesi — Android Jetpack Library

Mustafa Yiğit
HardwareAndro
Published in
5 min readJul 23, 2020
navigation-component

Merhaba, bu yazımızda Google tarafından bizlere sunulan Android Jetpack kütüphanelerinden biri olan Navigation Component’i inceleyeceğiz. Navigation Component ekranlar arası geçiş ve veri transferinde işimizi oldukça kolaylaştırıyor.

Navigation Component Neden Var?

Öncelikle bir teknolojiyi özümsemek için hangi sorunlara çözüm getirdiğini kavramak gereklidir.

Çok ekranlı uygulamalarda akış kritik öneme sahiptir. Algılaması ve yönetim ne kadar kolay olursa ekip ve yeni katılımcıların işi o kadar kolay olur. Navigation Component bünyesinde barındırdığı Navigation Graph ile bize uygulamamızın akışını ve veri transferini tek bir ekranda gösterebiliyor.

Bir ekranda ihtiyacımız olan verileri sağlamanın birçok yolu vardır. (Intent-Bundle, Shared Preferences, Content Provider,…) Navigation Component bu listeye bir yenisini ekliyor: Safe Args. Bu özellik ile ekranlarımızın ihtiyaç duyduğu verileri Navigation Graph üzerinden belirleyebiliyoruz.

Ekranlar arası gezinirken geçiş animasyonu eklemek istersek, Navigation Graph üzerinde hazır animasyonları ya da kendi hazırladığımız animasyonları ekleyebiliriz.

Eğer ekranlar arası akışta ekrana özel kısıtlamalarımız ya da kontrollerimiz varsa bunu her ekran yönetimini ayrı bir yerde yapmak yerine; Navigation Controller ile yönetebiliriz. Aynı şekilde navigation controller ile UI bileşenlerini (Bottom Navigation View, Navigation Drawer, ActionBar,…) de birbirine bağlayarak ekran yönetimini bir üste taşıyabiliriz.

Eğer uygulama içeriğini paylaşmak ya da bir ekranımıza yönlendiren link paylaşmak istersek, burada devreye deep link giriyor.

Tüm bu özellikleri tek bir yerden yönetebilmek (navigation graph) Navigation Component’i kolay kullanabilir kılıyor. Tabiki belirtilen özellik ve gereksinimleri çözmenin birçok yolu var fakat bu kütüphanenin işleri biraz daha kolaylaştırdığını söyleyebilirim.

Navigation Component Kusursuz Mu?

Birçok güzel özelliğinin yanı sıra eksik ya da kusurlarından bahsetmemek olmaz tabiki.
Navigation Component ile ekran gezintilerinde ileri geri aksiyonlarında ekranlar yeniden çizilir. Eğer ilgili lifecycle fonksiyonlarında büyük işlemlerimiz varsa bunlar da tekrarlanır. Bunu önlemek için hacky çözümler bulunmaktadır fakat doğrudan navigation component içinde bir çözüm yolu yoktur. (Eğer viewmodel ile beraber kullanmıyorsak)

Ian Lake — Single Activity

Navigation Componentin, Single Activity Pattern ile kullanılması tavsiye edilir. Fakat birden fazla activity ile çalışmak zorunda kalabiliriz. Ya da multi module projeye sahip olabiliriz. Bu tür projelerde yaşanan sıkıntıları anlatan makaleye burdan erişebilirsiniz.

Ayrıca hali hazırda eski yönlendirme apilerini kullanan bir projede iseniz, migrate ve refactoring işlemleri biraz daha sancılı olabilir.

Navigation Component Nasıl Kullanılır?

Android Jetpack’in Navigation kütüphanesi hakkında biraz bilgi edindimizi düşünüyorum. Şimdi teorik kısımdan gerçek dünyaya inelim :)

Öncelikle projemize gerekli bağımlılıkları ekleyelim. Örnek projemizi Kotlin diliyle ilerleteceğim için ben Java bağımlılıklarını eklemiyorum. Eğer ihtiyacınız varsa onları da ekleyebilirsiniz.

def nav_version = "2.3.0"
// Java language implementation
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
// Kotlin
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

Eğer safe args ile veri taşımak isterseniz module gradle ve project gradle içine ekleme yapmamız gerekir:

module gradle: 
for kotlin
only modules --> apply plugin:"androidx.navigation.safeargs.kotlin"
for java/kotlin --> apply plugin:"androidx.navigation.safeargs"
project gradle: def nav_version = "2.3.0"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"

Navigation Component, üç ana bileşenden oluşur:

  • NavGraph → Aksiyonların oluşturulduğu özel xml dosyası.
  • NavHost → Fragmentların yerleşeceği container fragment
  • NavController → Yönlendirmeleri kontrol edebileceğimiz denetleyici
navigation host
navigation xml

Navigation Component, Bottom Navigation View ya da Navigation Drawer gibi hazır ui bileşenleri ile kullanıldığında action belirtmeye gerek kalmaz. Çünkü bünyesinde bu bileşenleri ile entegre olabilecek bir yapı vardır.

https://developer.android.com/reference/androidx/navigation/ui/NavigationUI#public-methods

Biz bottom navigation view ve action bar konfigürasyonu yapmak istediğimizde 4 aşamalı bir kod bloğuna ihtiyaç duyuyoruz.

NavController’a erişmek için aşağıdaki fonksiyonları kullanabiliriz:

  • Fragment.findNavController()
  • View.findNavController()
  • Activity.findNavController()

Bağlantılar sonrası çıktımız şu şekilde olacaktır:

navigation-fragments

Directions — NavGraph

Şimdi Navigation Graphta biraz detaylara inelim.
Bir direction yani yönlendirme oluşturmak için design kısmından basitçe başlangıçtan varış noktasına doğru ok çizebiliriz. Ya da xml tarafında kod ile gerçekleştirebiliriz.
İki farklı işlemin sonunda, projemizi build ettiğimiz zaman generated klasörünün altında başlangıç fragment dosyasına özel directions classı oluşturulur.
Home Fragment → HomeFragmentDirections

directions — navigation grap
directions — fragment

Verilen yönlendirmeler sonucu, backstack yönetimi yapmak istersek popUpTo ile verilen id backstackta kalır.
Oluşturduğumuz yönlendirmelere generated edilen classtan ya da doğrudan id üzerinden erişebiliriz.

Animations — NavGraph

Geçişler arasında animasyonları graph üzerinde kolayca ekleyebiliriz.

navigation-action

Safe Args — NavGraph

Ekranlar arası veri taşımak için kullanabileceğimiz safe args plugini bize gerekli argümanları isteyen generated classlar sunar. Argümanlar hedef ekrana ait olur.

safe args
safe args
navigation safe args
navigation-safeargs

NavigationDestinationListener — NavController

Navigation Controller, varış ekranı ile ilgili ayarlar ya da kısıtlamalara ihtiyacımız olduğu durumlarda bizlere basitçe tek bir noktadan yönetebileceğimiz destination arayüzü sağlar.

destination listener

Navigation Component ile ilgili bahsedeceklerim şimdilik bu kadar. Umarım faydalı bir yazı olmuştur. Daha fazla detay için kaynaklara bakabilirsiniz.

Herhangi bir ekleme/düzeltme isteği olursa yorum kısmından belirtebilirsiniz :)

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

Proje: https://github.com/mustafayigitt/AndroidLearningProjects/tree/master/NavigationComponentExample

--

--