Dairesel gezinme

Bir varış noktasına geri dönmeniz gereken yerin açık bir örneği, navigasyonun dairesel biçimde olmasıdır. Bu dokümanda, söz konusu kullanım alanı özetlenmektedir.

Senaryo

Uygulamanızın üç hedefi olduğunu düşünün: A, B ve C. Ayrıca A'dan B'ye, B'den C'ye, C'den de A'ya dönüşen işlemler de vardır. İlgili gezinme grafiği aşağıdaki gibi görünür:

dairesel gezinme gösterimi
Şekil 1. A, B ve C olmak üzere üç hedef içeren dairesel bir gezinme grafiği.

NavController, her gezinme işlemiyle birlikte yeni hedefi arka yığına ekler. Yani şemadaki akışta tekrar tekrar gezinmek, arka yığınınızın her bir hedeften birden fazla küme içermesine neden olur: A, B, C, A, B, C, A, B, C.

Çözüm

Arka yığınınızda tekrarı önlemek için NavController.navigate() çağrınızda veya gezinme işleminizde popUpTo() ve inclusive öğelerini belirtin.

C hedefine ulaştıktan sonra, arka yığının her hedefin bir örneğini içerdiğini düşünün: A, B, C. Kullanıcıyı C hedefinden A hedefine yönlendiren işlem veya navigate() çağrısında popUpTo() ve inclusive değerlerini tanımladığınızdan emin olmanız gerekir.

Bu durumda, kullanıcı C hedefinden A hedefine geri gittiğinde NavController, A'da da görünür. Bu da B ve C'yi yığından kaldırdığı anlamına gelir. inclusive = true ile ilk A da çıkarılarak yığını etkili bir şekilde temizlenir.

Oluşturma uygulaması

Aşağıda, Oluşturma'daki dairesel popUpTo() için çözümün uygulanması verilmiştir:

// When creating your `NavGraph` in your `NavHost`.
composable("c") {
    DestinationC(
        onNavigateToA = {
          navController.navigate("a") {
            popUpTo("a") {
              inclusive = true
            }
          }
        },
    )
}

Görüntülemelerin uygulanması

Aşağıda, Views'ta döngüsel popUpTo için çözümün uygulanması verilmiştir:

<fragment
    android:id="@+id/c"
    android:name="com.example.myapplication.C"
    android:label="fragment_c"
    tools:layout="@layout/fragment_c">

    <action
        android:id="@+id/action_c_to_a"
        app:destination="@id/a"
        app:popUpTo="@+id/a"
        app:popUpToInclusive="true"/>
</fragment>