NavController
, kullanıcının ziyaret ettiği hedefleri içeren bir "arka yığın" barındırır. Kullanıcı, uygulama genelinde ekranlara giderken NavController
, arka yığına hedefler ekler ve arka yığından hedefler kaldırır.
Arka yığın, yığın olma durumunda "son giren, ilk çıkar" bir veri yapısıdır.
Dolayısıyla NavController
, öğeleri yığına aktarır ve üstten çıkarır.
Temel davranış
Geri yığının davranışı hakkında göz önünde bulundurmanız gereken temel gerçekler şunlardır:
- İlk hedef: Kullanıcı uygulamayı açtığında
NavController
, ilk hedefi arka yığının en üstüne aktarır. - Yığına aktarma: Her bir çağrı
NavController.navigate()
, belirtilen hedefi yığının en üstüne iter. - En üst hedefi açma: Yukarıya veya Geri'ye dokunulduğunda sırasıyla
NavController.navigateUp()
veNavController.popBackStack()
yöntemleri çağrılır. En popüler varış noktası yığından dışarı çıkarılıyor. Yukarı ve Geri arasındaki fark hakkında daha fazla bilgi için Gezinme İlkeleri sayfasına bakın.
Geri dön
NavController.popBackStack()
yöntemi, geçerli hedefi arka yığından çıkarmaya ve önceki hedefe gitmeye çalışır. Bu da kullanıcıyı gezinme geçmişinde bir adım geriye etkili bir şekilde geri götürür. Hedefe başarıyla geri gidip gelmediğini gösteren bir boole döndürür.
Belirli bir hedefe dönme
Belirli bir hedefe gitmek için popBackStack()
tuşunu da kullanabilirsiniz. Bunu yapmak için aşırı yüklerinden birini kullanın. Tam sayı id
veya route
dizesi gibi birkaç tanımlayıcıyı iletmenize olanak tanır. Bu aşırı yüklemeler kullanıcıyı, belirtilen tanımlayıcıyla ilişkili hedefe götürür. En önemlisi de, her şeyi bu hedefin üstündeki yığında yerleştirirler.
Bu aşırı yüklemeler ayrıca inclusive
boole değerini de alır. NavController
öğesinin, hedefe gittikten sonra belirtilen hedefi arka yığından da çıkarıp çıkarmayacağını belirler.
Örnek olarak şu kısa snippet'i inceleyin:
navController.popBackStack(R.id.destinationId, true)
Burada NavController
, destinationId
tam sayı kimliğine sahip hedefe geri döner. inclusive
bağımsız değişkeninin değeri true
olduğundan, NavController
ayrıca belirtilen hedefi arka yığından çıkarır.
Başarısız olan geri açma işlemini işleme
popBackStack()
, false
değerini döndürürse sonraki NavController.getCurrentDestination()
çağrısı null
değerini döndürür. Bu da uygulamanın, son hedefi arka yığından çıkardığı anlamına gelir. Bu durumda kullanıcı yalnızca
boş bir ekran görür.
Bu durum aşağıdaki durumlarda yaşanabilir:
popBackStack()
, yığından hiçbir şey çıkarmadı.popBackStack()
, arka yığından bir hedef çıkardı ve yığın artık boş.
Bu sorunu çözmek için yeni bir hedefe gitmeniz veya etkinliği sonlandırmak için finish()
numaralı telefonu çağırmanız gerekir. Aşağıdaki snippet bunu gösterir:
Kotlin
...
if (!navController.popBackStack()) {
// Call finish() on your Activity
finish()
}
Java
...
if (!navController.popBackStack()) {
// Call finish() on your Activity
finish();
}
Bir varış noktasına gidin
Bir hedeften diğerine giderken arka yığındaki hedefleri kaldırmak için ilişkili navigate()
işlev çağrısına bir popUpTo()
bağımsız değişkeni ekleyin. popUpTo()
, navigate()
çağrısının bir parçası olarak Gezinme kitaplığına arka yığındaki bazı hedefleri kaldırma talimatı verir. Parametre değeri, arka yığındaki bir hedefin tanımlayıcısıdır. Tanımlayıcı, tam sayı id
veya route
dizesi olabilir.
popUpTo()
içinde belirttiğiniz hedefin arka yığından çıkması gerektiğini belirtmek üzere inclusive
parametresi için true
değerine sahip bir bağımsız değişken ekleyebilirsiniz.
Bunu programatik olarak uygulamak için inclusive
, true
olarak ayarlanmış şekilde NavOptions
kapsamında popUpTo()
öğesini navigate()
öğesine iletin. Bu özellik hem Compose'da hem de Görünümler'de kullanılabilir.
Pencere açılırken durumu kaydet
Bir hedefe gitmek için popUpTo
kullandığınızda, isteğe bağlı olarak arka yığından çıkarılan tüm hedeflerin durumlarını kaydedebilirsiniz.
Bu seçeneği etkinleştirmek için popUpToSaveState
öğesini, ilişkilendirilmiş action
içinde true
olarak tanımlayın veya NavController.navigate()
çağrısını yapın.
Bir hedefe gittiğinizde, destination
özelliğindeki hedefle ilişkilendirilen durumu otomatik olarak geri yüklemek için restoreSaveState
öğesini true
olarak da tanımlayabilirsiniz.
XML örneği
Aşağıda, bir işlem kullanılarak XML'de 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 Örnekleri
Aşağıda, Compose'daki aynı yaklaşımın eksiksiz bir örneği verilmiştir:
@Composable
fun MyAppNavHost(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
startDestination: String = "destination_a"
) {
NavHost(
modifier = modifier,
navController = navController,
startDestination = startDestination
) {
composable("destination_a") {
DestinationA(
onNavigateToB = {
// 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") {
inclusive = true
saveState = true
}
}
},
)
}
composable("destination_b") { DestinationB(/* ... */) }
}
}
@ Composable
fun DestinationA(onNavigateToB: () -> Unit) {
Button(onClick = onNavigateToB) {
Text("Go to A")
}
}
NavController.navigate()
için nasıl arama yapacağınızı aşağıdaki yöntemlerle daha ayrıntılı bir şekilde değiştirebilirsiniz:
// 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
}
NavController.navigate()
öğesine iletme seçenekleri hakkında genel bilgi için Seçeneklerle gezinme kılavuzu'na bakın.
İşlemleri kullanarak pop
Bir işlemi kullanarak gezinirken, isteğe bağlı olarak arka yığından ek hedefler çıkarabilirsiniz. Örneğin, uygulamanızda ilk giriş akışı varsa kullanıcı giriş yaptıktan sonra, geri düğmesinin kullanıcıları tekrar giriş akışına yönlendirmemesi için girişle ilgili tüm hedefleri arka yığından çıkarmanız gerekir.
Ek kaynaklar
Daha fazla bilgi için aşağıdaki sayfaları okuyun:
- Dairesel gezinme: Gezinme akışlarının dairesel olduğu durumlarda tıkanıklıkların önüne nasıl geçebileceğinizi öğrenin.
- İletişim kutusu hedefleri: İletişim hedeflerinin arka yığınınızı yönetmeyle ilgili dikkat edilmesi gereken benzersiz noktaları nasıl sunduğunu okuyun.