Android Navigation Component Nedir?

ESRA KAYA
Ekmob Developer Studio
3 min readMar 2, 2020

Navigation, kullanıcıların uygulamanızdaki içerikler arasındaki gezintilerine ya da içeriklere girdikten sonra geri çıkmasına verilen isimdir. Peki kendimiz manuel olarak bu gezintileri yönetebiliyorken, navigation bileşeni bize ne sağlar? Navigation component belirlenmiş ilkelere bağlı kalarak tutarlı ve öngörülü bir kullanıcı deneyimi verebilmemiz için bize kolaylık sağlar. Yani bir kullanıcının girmiş olduğu içerikte back butonuna bastığında davranması gereken işi kendi yönetir.

Navigation component 3 önemli parçadan oluşur. Navigation graph (XML dosyası), NavHost, NavController. Uygulamadaki tüm hedefleriniz ve gidebileceğiniz yollar nav graph içerisinde bulunur. Uygulamada gezinirken NavController’a Navigation graph içerisindeki belirli bir yoldan ya da direkt olarak gitmek istediğiniz hedefi belirtirsiniz. Daha sonra NavController sizin için NavHost’a uygun hedefi gösterir.

Navigation bileşeninin avantajları;

  1. Fragment geçiş işlemlerini handle eder.
  2. Geri butonu işlevini varsayılana göre düzenler.
  3. Animasyonlar ve geçiş işlemleri için standartlaştırılmış kaynaklar sağlar.
  4. Deep linking işlemini handle eder.
  5. Navigation UI pattern içerir (navigation drawers, bottom navigation vs).
  6. Navigation Editor, hazırladığınız navigation graph’ı görmek veya düzenleyebilmek için kolaylık sağlar.

Şimdi bu bileşeni projeye nasıl ekleriz onu inceleyelim.

Tabiki ilk olarak uygulamamıza dependencies ekleyerek başlıyoruz.

dependencies {
def nav_version = "2.3.0-alpha02"
// Kotlin
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

// Testing Navigation
androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"
}

Daha sonra bir navigation graph oluşturuyoruz. Bu oluşturduğumuz xml aslında tüm geçişleri ve hedef fragmentlerinizi belirlediğiniz bir kaynak dosyasıdır. Aşağıdaki figürde her bir ekran bir fragmentı, oklar ise geçişleri temsil eder.

Projenize navigation graph eklemek için sağ tıklayıp yeni New > Android Resource File seçmeniz gerekmektedir. Gelen ekrandaki açılır listeden Resource type olarak Navigation seçin, dosyanın adını nav_graph ya da benzer bir şey yaparak kaydedin.

Oluşturduğumuz xml dosyasına tıkladığımızda karşımıza aşağıda eklemiş olduğum gibi bir editör ekranı açılacak. Burada daha önce oluşturmuş olduğunuz fragmentleri destination olarak gösterebilir ya da editörün sol üstündeki + ikonuna tıklayarak orada yeni bir fragment oluşturabilirsiniz.

Şimdi sırada bir activity’e NavHost ekleme var. Navigation component asıl olarak bir activity ve birden fazla fragment’tan oluşan yapılar için tasarlanmıştır. Ana activity bir navigation graph ile ilişkilidir ve hedefleri değiştirmekten sorumlu bir NavHostFragment içerir. Birden çok activity olan uygulamalarda fragment geçişleri için her activty’nin bir navigation graph’i vardır.

Activity’niz aşağıdaki gibi NavHostFragment içeren bir xml parçası bulundurmalıdır.

 <fragment
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />

Buraya kadar her şey tamam. Şimdi son olarak geçişleri yapmak kaldı. Bir fragment’a nasıl gideriz. Her NavHost’un bir NavController’ı vardır geçişleri o yönetir. NavController’ı bulmak için aşağıdaki yöntemlerden birini kullanabilirsiniz.

NavController’a eriştikten sonra navigate() methodunu kullanırsanız geçmek istediğiniz fragment’a geçmiş olursunuz. Burada dikkat edilmesi gereken bir nokta var. NavHost’unuzdaki belirtmiş olduğunuz navGraph’iniz geçmek istediğiniz fragmentları destination olarak belirlemelidir. Yoksa geçmek istediğiniz fragment’ı bulamayacak ve uygulamanız crash alıcaktır.

--

--