Kotlin DSL'yi kullanarak gezinme grafiğinde bir işlem tanımladığınızda Navigasyon, buna karşılık gelen bir NavAction
sınıfı oluşturur. Bu sınıf, aşağıdakiler dahil olmak üzere söz konusu işlem için tanımlanan yapılandırmaları içerir:
- Hedef: Hedef hedefin kaynak kimliği.
- Varsayılan bağımsız değişkenler: Sağlanmışsa hedef hedef için varsayılan değerleri içeren bir
android.os.Bundle
. - Navigasyon seçenekleri:
NavOptions
simgesiyle gösterilen gezinme seçenekleri. Bu sınıf; animasyon kaynağı yapılandırması, pop davranışı ve hedefin tek üst modda başlatılıp başlatılmayacağı da dahil olmak üzere hedef hedefe geçişle ilgili tüm özel yapılandırmayı içerir.
Oluşturma ile kullanılabilen seçenekler
navigate()
varsayılan olarak yeni hedefinizi arka gruba 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. Başka şekilde NavOptions.Builder
öğesine açıkça iletebileceğiniz navigate()
bağımsız değişkenlerini iletin. Aşağıdaki örnekleri inceleyin:
Örnekler için seçenekleri navigate()
öğesine bağlam içinde nasıl ileteceğinize ilişkin örnekler için geri yığın kılavuzuna bakın.
XML ile seçenekler
Aşağıda, iki ekran ve bir ekrandan diğerine geçmek için kullanılabilecek bir işlemden oluşan örnek bir grafik gösterilmektedir:
<?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>
Gezinme grafiği şişirildiğinde bu işlemler ayrıştırılır ve grafikte tanımlanan yapılandırmalarla bunlara karşılık gelen NavAction
nesneleri oluşturulur. Örneğin, action_b_to_a
, b
hedefinden a
hedefine gitmek olarak tanımlanır. İşlem, tüm hedefleri arka yığından kaldıran popTo
davranışının yanı sıra animasyonları da içerir. Bu ayarların tümü NavOptions
olarak yakalanır ve NavAction
öğesine eklenir.
Bu NavAction
talimatını uygulamak için aşağıdaki örnekte gösterildiği gibi işlemin kimliğini ileterek NavController.navigate()
özelliğini kullanın:
navController.navigate(R.id.action_b_to_a)
Seçenekleri programatik olarak uygulama
Yukarıdaki örnekler, gezinme grafiği XML'inde NavOptions
öğesinin nasıl belirtileceğini gösterir. Ancak belirli seçenekler, derleme sırasında bilinmeyen kısıtlamalara bağlı olarak değişiklik gösterebilir. Bu tür durumlarda, NavOptions
aşağıdaki örnekte gösterildiği gibi programlı bir şekilde oluşturulmalı ve 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, genişletilmiş bir navigate()
biçimi kullanılmakta olup ek Bundle
ve NavOptions
bağımsız değişkenleri yer almaktadır. Tüm navigate()
varyantlarının NavOptions
bağımsız değişkenini kabul eden genişletilmiş sürümleri vardır.
Örtülü derin bağlantılara giderken NavOptions
özelliğini 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ı için Uri
ve NavOptions
örneğini alır.