Örnek-1: NavController Kullanarak Bir Hedef Noktasına Gitmek
En basit haliyle belirli bir hedefe nasıl gidilir inceleyelim.
Hafızamızı tazeleyelim. Konu anlatım bölümümüzde hazırladığımız örnekte iki akışımız bulunuyordu.
blankFragment > blankFragment2 > blankFragment3 gidişini 1. Akış blankFragment > blankFragment4 > blankFragment5 gidişini 2. Akış
Biz 1. Akışta blankFragment2 ve blankFragment3'ü birleştirerek Nested Graph haline getirerek kapsüllemiştik. Birleştirdikten sonra aşağıdaki gibi navigation isimli id'ye sahip ve startDestination'ı blankFragment2 olan bir root dizini oluşmuştu.
<navigation
android:id="@+id/navigation"
app:startDestination="@id/blankFragment2">
<fragment
android:id="@+id/blankFragment2"
android:name="com.etiya.jpnavigation1.BlankFragment2"
android:label="fragment_blank_fragment2"
tools:layout="@layout/fragment_blank_fragment2">
<action
android:id="@+id/action_blankFragment2_to_blankFragment3"
app:destination="@id/blankFragment3" />
</fragment>
<fragment
android:id="@+id/blankFragment3"
android:name="com.etiya.jpnavigation1.BlankFragment3"
android:label="fragment_blank_fragment3"
tools:layout="@layout/fragment_blank_fragment3" />
</navigation>
Bunun anlamı, bizim NavController ile bağlantı sağladığımızda blankFragment2 sayfasına gitmesi gerektiğidir. O zaman hazırlıklarımızı yapalım.
Öncelikle fragment_blank.xml dosyasına gidelim ve aşağıdaki değişiklikleri yapalım.
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".BlankFragment">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tvMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@string/hello_blank_fragment"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintBottom_toBottomOf="parent" />
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
app:layout_constraintTop_toBottomOf="@id/tvMessage"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:text="Nested Graph'a Git" />
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
BlankFragment.kt dosyasında da aşağıdaki gibi bir OnClick event'ı işletelim.
class BlankFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val rootView: View =
inflater.inflate(R.layout.fragment_blank, container, false)
rootView.findViewById<Button>(R.id.btn).setOnClickListener {
findNavController().navigate(R.id.navigation)
}
return rootView
}
}
Dikkat ettiyseniz navigate ettiğimiz durumda gideceğimiz sayfaya hazırladığımız navigation isimli nested graph'ın id'sini verdik. Biz bu şekilde yapmış olsak da sistem, nested graph üzerinde startDestination'da tanımlı olan destination'a gidecek.

"Nested Graph'a Git" butonuna basıldıktan sonra da aşağıdaki gibi BlankFragment2 görüntüleniyor.

Biliyorsunuz destination'ları nested graph haline çevirmenin bir kapsülleme işlemi olduğunu belirtmiş ve kapsülün içerisindeki diğer destination'lara erişimin direkt yapılamayacağından söz etmiştik.
Bunun için örneğimi aşağıdaki gibi düzenleyip, bu sefer OnClick event'ını kapsülün içerisindeki diğer fragment olan BlankFragment3'e veriyorum.
rootView.findViewById<Button>(R.id.btn).setOnClickListener {
findNavController().navigate(R.id.blankFragment3)
}
Ancak uygulamam aşağıdaki hatayı verip kapanıyor.
blankFragment3 is unknown to this NavController
Bunun sebebi NavController'ın blankFragment3 isimli bir destination'ı tanımıyor olmasından kaynaklanıyor. Sebebi ise navigation isimli nested graph içerisinde yer alıyor olması. Çünkü nested graph kapsüllenerek çalışan bir sistem ve yalnızda startDestination üzerinde tanımlanan destination'a direkt erişim izni sağlar. Bunu da yalnızca nested graph id'si üzerinden gerçekleştirir. Yani aynı örneğimdeki OnClick event'ını direkt olarak BlankFragment2'ye de versem aynı hatayı alırdım.
Last updated
Was this helpful?