Gezinme ve arka plan yığını

NavController bir "geri yığını" barındırır kullanıcının veya oyununuzun ziyaret etti. Kullanıcı, uygulamanızdaki ekranlar arasında gezindikçe NavController, arka gruba hedef ekler ve arka yığından hedef kaldırır.

Yığın olma açısından, arka grup "son giren, ilk çıkar" veri yapısı. İlgili içeriği oluşturmak için kullanılan Bu nedenle NavController, öğeleri ekranın üst kısmına aktarır ve yığını.

Temel davranış

Bunlar, arkadakilerin davranışlarıyla ilgili göz önünde bulundurmanız gereken temel bilgilerdir yığın:

Geri aç

NavController.popBackStack() yöntemi, geçerli öğeyi öne çıkarmaya çalışır önceki hedefe gidin. Bu kullanıcıyı gezinme geçmişinde bir adım geri taşır. Şunu döndürür: hedefe başarıyla geri dönüp döndürülmediğini gösteren bir boole değeri.

Belirli bir hedefe geri dönün

Belirli bir hedefe gitmek için popBackStack() tuşunu da kullanabilirsiniz. Yapılacaklar Bu yüzden, aşırı yüklenmelerinden birini kullanın. Bir görevi başarıyla tamamlamanızı sağlayan (id tam sayı veya route dizesi gibi) bir tanımlayıcı içerir. Bu aşırı yüklenmeler, kullanıcıyı belirtilen tanımlayıcıyla ilişkili hedefe yönlendirir. En önemlisi, yığındaki her şeyi bu hedefin üzerine yerleştirirler.

Bu aşırı yüklemeler de inclusive boole değeri alır. Bu sonuç, NavController, belirtilen hedefi arka yığından da kaldırmalıdır bilgi edinebilirsiniz.

Şu kısa snippet'i bir örnek olarak inceleyelim:

navController.popBackStack(R.id.destinationId, true)

Burada NavController, tam sayı kimliğine sahip hedefe geri döner destinationId. inclusive bağımsız değişkeninin değeri true olduğundan NavController ayrıca arka yığından belirtilen hedefi açar.

Başarısız bir pop-back'i işleme

popBackStack() false değerini döndürdüğünde, NavController.getCurrentDestination(), null değerini döndürür. Bu, uygulamanın arkadaki son hedefi attı. Bu durumda, kullanıcı yalnızca boş bir ekran.

Bu, aşağıdaki durumlarda yaşanabilir:

  • popBackStack(), yığından herhangi bir öğeyi öne çıkarmadı.
  • popBackStack(), arka yığından bir hedef çıkardı ve yığın artık boş.

Bu sorunu çözmek için yeni bir hedefe gitmeli veya finish() numaralı telefonu aramalısınız tıklayın. Aşağıdaki snippet bunu göstermektedir:

Kotlin

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish()
}

Java

...

if (!navController.popBackStack()) {
    // Call finish() on your Activity
    finish();
}

Bir hedefe gidin

Bir hedeften giderken arka yığından hedefleri kaldırmak için diğerinde, ilişkilendirilmiş navigate() işlevine bir popUpTo() bağımsız değişkeni ekleyin çağrısına bir tıklama URL'si eklemeniz gerekir. popUpTo(), Navigasyon kitaplığına bazı hedefleri kaldırması için talimat verir navigate() çağrısının parçası olarak arka yığından. Parametre değeri: arka yığındaki bir hedefin tanımlayıcısıdır. Tanımlayıcı, id tam sayısı veya route dizesi.

inclusive parametresi için true değerine sahip bir bağımsız değişken ekleyebilirsiniz popUpTo() öğesinde belirttiğiniz hedefin aynı zamanda pop-up pencere açar.

Bunu programatik olarak uygulamak için popUpTo() öğesini şunun bir parçası olarak navigate() öğesine iletin: inclusive ile NavOptions, true olarak ayarlandı. Bu özellik, hem Oluştur hem de Görüntüleme sayısı.

Pop-up açılırken durumu kaydet

Bir hedefe gitmek için popUpTo kullandığınızda isteğe bağlı olarak arka yığından fırlatılan tüm hedeflerin durumlarını görebilirsiniz. Şunları yapabilirsiniz: ardından ilgili hedefe giderken geri yığını ve hedefleri geri yükleyin daha ileri bir tarihte başlayabilirsiniz. Bu, belirli bir hedef için durumu korumanıza ve daha birden fazla arkaya grup ekleyin.

Bunu programatik olarak yapmak için popUpTo öğesini eklerken saveState = true belirtin. kontrol edebilirsiniz.

Ayrıca gezinme seçeneklerinizde restoreState = true değerini de belirtebilirsiniz. arka yığını ve seçeceğiz.

Örnek:

navController.navigate(
    route = route,
    navOptions =  navOptions {
        popUpTo<A>{ saveState = true }
        restoreState = true
    }
)

XML'de durumu kaydetmeyi ve geri yüklemeyi etkinleştirmek için popUpToSaveState öğesini true olarak tanımlayın ve restoreState, ilişkili action içinde sırasıyla true.

XML örneği

Aşağıda, bir işlem kullanılan XML'deki popUpTo örneği verilmiştir:

<action
  android:id="@+id/action_a_to_b"
  app:destination="@id/b"
  app:popUpTo="@+id/a"
  app:popUpToInclusive="true"
  app:restoreState=”true”
  app:popUpToSaveState="true"/>

Oluşturma örneği

Aşağıda, Compose'da bunun tam bir örneği verilmiştir:

@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
    startDestination: Any = A
) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = startDestination
    ) {
        composable<A> {
            DestinationA(
                onNavigateToB = {
                // Pop everything up to, and including, the A destination off
                // the back stack, saving the back stack and the state of its
                // destinations.
                // Then restore any previous back stack state associated with
                // the B destination.
                // Finally navigate to the B destination.
                    navController.navigate(route = B) {
                        popUpTo<A> {
                            inclusive = true
                            saveState = true
                        }
                        restoreState = true
                    }
                },
            )
        }
        composable<B> { DestinationB(/* ... */) }
    }
}

@Composable
fun DestinationA(onNavigateToB: () -> Unit) {
    Button(onClick = onNavigateToB) {
        Text("Go to A")
    }
}

Daha ayrıntılı olarak, NavController.navigate() ile iletişim kurma şeklinizi şu yöntemleri kullanabilirsiniz:

// Pop everything up to the destination_a destination off the back stack before
// navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a")
}

// Pop everything up to and including the "destination_a" destination off
// the back stack before navigating to the "destination_b" destination
navController.navigate("destination_b") {
    popUpTo("destination_a") { inclusive = true }
}

// Navigate to the "search” destination only if we’re not already on
// the "search" destination, avoiding multiple copies on the top of the
// back stack
navController.navigate("search") {
    launchSingleTop = true
}

Seçenekleri NavController.navigate() cihazına iletme hakkında genel bilgi için bkz. Seçeneklerle gezinme rehberini inceleyin.

İşlemleri kullanarak pop

Bir işlemi kullanarak gezinirken isteğe bağlı olarak ek hedefler gösterebilirsiniz yardımcı olur. Örneğin, uygulamanızda başlangıçta bir giriş akışı varsa, bir kullanıcı giriş yaptığında, girişle ilgili tüm hedefleri açmanız gerekir. ve geri düğmesinin kullanıcının yeniden giriş bilgisine geri dönmesini akışı sağlar.

Ek kaynaklar

Daha fazla bilgi için aşağıdaki sayfaları okuyun:

  • Dairesel gezinme: Aşırı yüklenmekten nasıl kaçınabileceğinizi öğrenin kullanmalarını kolaylaştırır.
  • İletişim kutusu hedefleri: Diyalog hedeflerinin, diyalog nasıl yöneteceğinizle ilgili dikkat edilmesi gereken birkaç önemli nokta vardır.