# Örnek-2: Destination'lar Arasında Veri Aktarma

Bildiğiniz gibi aslında ulaşmaya çalıştığımız her destination bizim için aynı zamanda basit anlamda bir sayfa anlamında. Navigation komponenti ortaya çıkmadan önce de veri aktarım işlemini **Bundle**'lar aracılığı ile gerçekleştirebiliyorduk. Artık bu yöntemi klasik metot diye adlandıralım. Navigation'ın getirdiği bir yenilikte veri aktarımını **Safe Args** ismiyle tip güvenliği sağlayarak yapıyor olması.&#x20;

Projenizde sayfalar arasında geçiş yaparken tip güvenliği sağlayan **Safe Args**'ı da kullanacaksanız, ona ait **gradle** eklemesini de yapmanız gerektiğini ve nasıl yapıldığını [03](https://egemen-mede.gitbook.io/jetpack-navigation/03.-navigationi-android-projesine-ekleme) numaralı dersimizde öğrenmiştik.

### Tip Güvenliği Olmayan Yöntem

Şimdi önceliği klasik metot olan ve tip güvenliği sağlamayan **Bundle**'a verip, veri aktarma işlemini nasıl yapacağımızı örnekleyelim.

Öncelikle şöyle bir senaryomuz olacak. **BlankFragmet** içerisinde bize veri sağlayacak **etName** isimli bir **EditText** ekledim. Buna göre de yeni **XML** dosyamız aşağıdaki gibi oluştu.

```markup
<?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" />

        <EditText
            android:id="@+id/etName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:hint="Adınızı Giriniz"
            android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@id/tvMessage"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:importantForAutofill="no"
            android:inputType="text" />

        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            app:layout_constraintTop_toBottomOf="@id/etName"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:text="Nested Graph'a Git" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</FrameLayout>
```

**BlankFragment.kt** dosyamızı da aşağıdaki gibi güncelliyorum.

```kotlin
class BlankFragment : Fragment() {

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

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        btn.setOnClickListener {
            val bundle = bundleOf("nameArg" to etName.text.toString())
            findNavController().navigate(R.id.navigation, bundle)
        }
    }

}
```

![BlankFragment, veri alışı](https://2300662549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M-9we-f91sgtHSNx_N3%2F-M-K4CFxSRoacVPYu1D8%2F-M-KJWUQsGd_zrNvcmWe%2F026.jpeg?alt=media\&token=4addc878-7165-4e26-99d2-37d88245346b)

Koddan da anlaşılacağı üzere **EditText**' e girilen metni alıp, oluşturduğumuz **bundle**' ı **NavController** aracılığı ile hedef sayfamız olan **BlankFragment2**' ye gönderiyoruz.

Burada da gönderilen bundle'ı alarak, ekranda gösterimini sağlıyoruz.

```kotlin
class BlankFragment2 : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_blank_fragment2, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        tvMessage.text = "Diğer sayfadan gelen veri: " + arguments?.getString("nameArg")
    }
}
```

![BlankFragment2, veri gösterimi](https://2300662549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M-9we-f91sgtHSNx_N3%2F-M-K4CFxSRoacVPYu1D8%2F-M-KJmqNg665DGsei39R%2F027.jpeg?alt=media\&token=0b80c0c7-2754-4292-b8c5-c7c0a1fde7f0)

### Safe Args kullanarak veri aktarımı

İlk olarak **BlankFragment**' ten ulaşacağım hedef olan **BlankFragment4**'e bir **argüman** geçmekle işe başlıyoruz. Bunun için **nav\_graph.xml** dosyamızın **dizayn** bölümünü açarak aşağıdaki gibi **BlankFragment4**'ü seçili hale getiriyorum ve sağ taraftaki panelde bulunan **Argument** bölümünde **+** simgesine tıklıyorum.

![Argünman Ekleme Penceresi](https://2300662549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M-9we-f91sgtHSNx_N3%2F-M-KRE77KpdtghUlXI-d%2F-M-OQ8GH7y8ELTZgXl44%2F028.png?alt=media\&token=d63f9e3c-c7ba-4202-ad0c-8a7af8f509e0)

**Name** alanına "**nameField**" yazıp, **Type** alanı için **String** seçiyorum. **Add** butonuna bastığımda **XML** yapısı da aşağıdaki gibi oluşacaktır.

```markup
<fragment
    android:id="@+id/blankFragment4"
    android:name="com.etiya.jpnavigation1.BlankFragment4"
    android:label="fragment_blank_fragment4"
    tools:layout="@layout/fragment_blank_fragment4">
    <action
        android:id="@+id/action_blankFragment4_to_blankFragment5"
        app:destination="@id/blankFragment5" />
    <argument
        android:name="nameField"
        app:argType="string" />
</fragment>
```

Gördüğünüz gibi **Add Argument Link** penceresinden giriş yaptığım bilgiler **XML** üzerinden **argument tag**'i ile **blankFragment** içerisinde eklenmiş oldu.

**fragment\_blank.xml** dosyasını da aşağıdaki gibi güncelliyorum.

```markup
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    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_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <EditText
            android:id="@+id/etName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:hint="Adınızı Giriniz"
            android:importantForAutofill="no"
            android:inputType="text"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/tvMessage" />

        <Button
            android:id="@+id/btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="Fragment 4'e Git"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/etName" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</FrameLayout>
```

**BlankFragment.kt** dosyamı kullanarak diğer sayfaya gidiş işlemini başlatabilirim.

```kotlin
class BlankFragment : Fragment() {

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

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        btn.setOnClickListener {
            val action = BlankFragmentDirections.actionBlankFragmentToBlankFragment4(etName.text.toString())
            findNavController().navigate(action)
        }
    }

}
```

Kodumuzda **BlankFragmentDirections** bölümü dikkatinizi çekmiştir. **NavDirection**'ları yöneten ve **Safe Args** için eklediğimiz gradle plugin'inin ürettiği sınıflardan oluşuyor. Devamındaki **actionBlankFragmentToBlankFragment4** metodu ise tanımladığınız action'ı, içerisindeki parametrede biraz önce tanımladığımız argümanı geçeceğiniz alanı belirtir.

![BlankFragment](https://2300662549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M-9we-f91sgtHSNx_N3%2F-M-KRE77KpdtghUlXI-d%2F-M-OWImRYC9vStMVP7WF%2F029.jpeg?alt=media\&token=c74b8025-5ec7-450e-bc5e-2ec2a2bee9e1)

> Bu işlemi gerçekleştirdiğinizde Android Studio bazen kendini yenileyemeye biliyor. Generate edilen sınıfların aktif olması için Android Studio üzerinde Build > Clean Project ve Rebuild Project yaparsanız iyi olur.

Pekala, argümanımızı yukarıdaki gibi **BlankFragment4**'e göndermiş olduk. Peki nasıl alacağız? Bunun için de **BlankFragment4.kt** içerisine girip aşağıdaki gibi düzenliyoruz.

```kotlin
class BlankFragment4 : Fragment() {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_blank_fragment4, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        tvMessage.text = "Diğer sayfadan gelen veri: " + arguments?.getString("nameField")
    }

}
```

Uygulamamızın son hali de aşağıdaki gibi oluşacaktır.

![BlankFragment4](https://2300662549-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M-9we-f91sgtHSNx_N3%2F-M-KRE77KpdtghUlXI-d%2F-M-OWT350vi3m4C5PXPo%2F030.jpeg?alt=media\&token=f7315d9d-9128-441a-8202-52ed96179ef3)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://egemen-mede.gitbook.io/jetpack-navigation/11.-talk-is-cheap-show-me-the-code/oernek-2-destinationlar-arasinda-veri-aktarma.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
