Seçeneklerle gezin

Kotlin DSL'yi kullanarak gezinme grafiğinde bir işlem tanımladığınızda Navigasyon, buna karşılık gelen bir NavAction sınıfı oluşturur. Bu sınıf, aşağıdakiler dahil olmak üzere söz konusu işlem için tanımlanan yapılandırmaları içerir:

  • Hedef: Hedef hedefin kaynak kimliği.
  • Varsayılan bağımsız değişkenler: Sağlanmışsa hedef hedef için varsayılan değerleri içeren bir android.os.Bundle.
  • Navigasyon seçenekleri: NavOptions simgesiyle gösterilen gezinme seçenekleri. Bu sınıf; animasyon kaynağı yapılandırması, pop davranışı ve hedefin tek üst modda başlatılıp başlatılmayacağı da dahil olmak üzere hedef hedefe geçişle ilgili tüm özel yapılandırmayı içerir.

Oluşturma ile kullanılabilen seçenekler

navigate() varsayılan olarak yeni hedefinizi arka gruba ekler. navigate() çağrınıza ek gezinme seçenekleri ileterek navigate() davranışını değiştirebilirsiniz.

Basit bir lambda kullanarak NavOptions örneği oluşturabilirsiniz. Başka şekilde NavOptions.Builder öğesine açıkça iletebileceğiniz navigate() bağımsız değişkenlerini iletin. Aşağıdaki örnekleri inceleyin:

Örnekler için seçenekleri navigate() öğesine bağlam içinde nasıl ileteceğinize ilişkin örnekler için geri yığın kılavuzuna bakın.

XML ile seçenekler

Aşağıda, iki ekran ve bir ekrandan diğerine geçmek için kullanılabilecek bir işlemden oluşan örnek bir grafik gösterilmektedir:

<?xml version="1.0" encoding="utf-8"?>
<navigation 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:id="@+id/nav_graph"
            app:startDestination="@id/a">

    <fragment android:id="@+id/a"
              android:name="com.example.myapplication.FragmentA"
              android:label="a"
              tools:layout="@layout/a">
        <action android:id="@+id/action_a_to_b"
                app:destination="@id/b"
                app:enterAnim="@anim/nav_default_enter_anim"
                app:exitAnim="@anim/nav_default_exit_anim"
                app:popEnterAnim="@anim/nav_default_pop_enter_anim"
                app:popExitAnim="@anim/nav_default_pop_exit_anim"/>
    </fragment>

    <fragment android:id="@+id/b"
              android:name="com.example.myapplication.FragmentB"
              android:label="b"
              tools:layout="@layout/b">
        <action android:id="@+id/action_b_to_a"
                app:destination="@id/a"
                app:enterAnim="@anim/nav_default_enter_anim"
                app:exitAnim="@anim/nav_default_exit_anim"
                app:popEnterAnim="@anim/nav_default_pop_enter_anim"
                app:popExitAnim="@anim/nav_default_pop_exit_anim"
                app:popUpTo="@+id/a"
                app:popUpToInclusive="true"/>
    </fragment>
</navigation>

Gezinme grafiği şişirildiğinde bu işlemler ayrıştırılır ve grafikte tanımlanan yapılandırmalarla bunlara karşılık gelen NavAction nesneleri oluşturulur. Örneğin, action_b_to_a, b hedefinden a hedefine gitmek olarak tanımlanır. İşlem, tüm hedefleri arka yığından kaldıran popTo davranışının yanı sıra animasyonları da içerir. Bu ayarların tümü NavOptions olarak yakalanır ve NavAction öğesine eklenir.

Bu NavAction talimatını uygulamak için aşağıdaki örnekte gösterildiği gibi işlemin kimliğini ileterek NavController.navigate() özelliğini kullanın:

    navController.navigate(R.id.action_b_to_a)

Seçenekleri programatik olarak uygulama

Yukarıdaki örnekler, gezinme grafiği XML'inde NavOptions öğesinin nasıl belirtileceğini gösterir. Ancak belirli seçenekler, derleme sırasında bilinmeyen kısıtlamalara bağlı olarak değişiklik gösterebilir. Bu tür durumlarda, NavOptions aşağıdaki örnekte gösterildiği gibi programlı bir şekilde oluşturulmalı ve ayarlanmalıdır:

Kotlin

findNavController().navigate(
R.id.action_fragmentOne_to_fragmentTwo,
null,
navOptions { // Use the Kotlin DSL for building NavOptions
    anim {
        enter = android.R.animator.fade_in
        exit = android.R.animator.fade_out
    }
  }
)

Java

NavController navController = NavHostFragment.findNavController(this);
  navController.navigate(
    R.id.action_fragmentOne_to_fragmentTwo,
    null,
    new NavOptions.Builder()
      .setEnterAnim(android.R.animator.fade_in)
      .setExitAnim(android.R.animator.fade_out)
      .build()
  );

Bu örnekte, genişletilmiş bir navigate() biçimi kullanılmakta olup ek Bundle ve NavOptions bağımsız değişkenleri yer almaktadır. Tüm navigate() varyantlarının NavOptions bağımsız değişkenini kabul eden genişletilmiş sürümleri vardır.

Örtülü derin bağlantılara giderken NavOptions özelliğini programatik olarak da uygulayabilirsiniz:

Kotlin

findNavController().navigate(
    deepLinkUri,
    navOptions { // Use the Kotlin DSL for building NavOptions
        anim {
            enter = android.R.animator.fade_in
            exit = android.R.animator.fade_out
        }
    }
)

Java

NavController navController = NavHostFragment.findNavController(this);
navController.navigate(
        deepLinkUri,
        new NavOptions.Builder()
                .setEnterAnim(android.R.animator.fade_in)
                .setExitAnim(android.R.animator.fade_out)
                .build()
);

Bu navigate() varyantı, örtülü derin bağlantı için Uri ve NavOptions örneğini alır.