Kotlin DSL'yi kullanarak gezinme grafiğinde bir işlem tanımladığınızda Navigation, bu işlem için tanımlanan yapılandırmaları içeren karşılık gelen bir NavAction sınıfı oluşturur. Bu yapılandırmalar arasında şunlar yer alır:
- Hedef: Hedefin kaynak kimliği.
- Varsayılan bağımsız değişkenler: Hedef hedef için varsayılan değerleri içeren bir
android.os.Bundle(sağlanırsa). - Gezinme seçenekleri:
NavOptionsolarak gösterilen gezinme seçenekleri. Bu sınıf, hedef hedefe geçiş ve hedef hedeften geri geçiş için gerekli tüm özel yapılandırmayı (animasyon kaynağı yapılandırması, pop davranışı ve hedefin tek üst modda başlatılıp başlatılmayacağı dahil) içerir.
Oluşturma ile ilgili seçenekler
Varsayılan olarak navigate(), yeni hedefinizi geri yığına 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. Normalde NavOptions.Builder öğesine açıkça aktarabileceğiniz bağımsız değişkenleri navigate() öğesine aktarın. Aşağıdaki örnekleri inceleyin:
Örnekler için geri yığın kılavuzuna bakın. Bu kılavuzda, seçeneklerin bağlam içinde navigate() öğesine nasıl iletileceğiyle ilgili örnekler yer alır.
XML ile seçenekler
Aşağıda, bir ekrandan diğerine gitmek için kullanılan bir işlemle birlikte iki ekrandan oluşan örnek bir grafik verilmiştir:
<?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>
Geçiş grafiği genişletildiğinde bu işlemler ayrıştırılır ve grafikte tanımlanan yapılandırmalarla karşılık gelen NavAction nesneleri oluşturulur. Örneğin, action_b_to_a, hedef b'ten hedef a'ye gitme olarak tanımlanır. Bu işlem, arka yığında bulunan tüm hedefleri kaldıran popTo davranışının yanı sıra animasyonları da içerir. Bu ayarların tümü NavOptions olarak kaydedilir ve NavAction'ye eklenir.
Bu NavAction'i uygulamak için aşağıdaki örnekte gösterildiği gibi işlemin kimliğini ileterek NavController.navigate()'i kullanın:
navController.navigate(R.id.action_b_to_a)
Seçenekleri programatik olarak uygulama
Önceki örneklerde, gezinme grafiği XML'sinde NavOptions öğesinin nasıl belirtileceği gösterilmektedir. Ancak belirli seçenekler, derleme süresinde bilinmeyen kısıtlamalara bağlı olarak değişebilir. Bu gibi durumlarda, aşağıdaki örnekte gösterildiği gibi NavOptions programatik olarak oluşturulup 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 navigate()'nin genişletilmiş bir biçimi kullanılmakta ve ek Bundle ile NavOptions bağımsız değişkenleri bulunmaktadır. navigate() işlevinin tüm varyantlarında NavOptions bağımsız değişkenini kabul eden genişletilmiş sürümler bulunur.
Ayrıca, örtülü derin bağlantılara giderken NavOptions öğesini 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ı ve NavOptions örneği için Uri alır.