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:
- İlk hedef: Kullanıcı uygulamayı açtığında
NavController
ilk hedefi arka yığının en üstüne aktarır. - Yığına aktarma: Her çağrı
NavController.navigate()
yığının en üstüne eklenir. - En üstteki hedefi büyütme: Yukarı veya Geri'ye dokunduğunuzda
NavController.navigateUp()
veNavController.popBackStack()
yöntemlerine bakalım. En üstteki hedefi yığından kaldırırlar. Bkz. Gezinme ilkeleri sayfası Yukarı ve Geri arasında.
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.