Navigation bileşeni, bir hedefe gitmek için basit ve genel bir yöntem sunar. Bu arayüz, çeşitli bağlamları ve kullanıcı arayüzü çerçevelerini destekler. Örneğin, Navigation bileşenini Compose, görünümler, parçalar, etkinlikler ve hatta özel kullanıcı arayüzü çerçeveleriyle kullanabilirsiniz.
Bu kılavuzda, çeşitli bağlamlarda bir hedefe gitmek için Navigation bileşenini nasıl kullanabileceğiniz açıklanmaktadır.
NavController kullanma
Hedefler arasında geçiş yapmak için kullandığınız anahtar türü NavController'dır.
Sınıfın kendisi ve sınıfın bir örneğini oluşturma hakkında daha fazla bilgi için Gezinme denetleyicisi oluşturma başlıklı makaleyi inceleyin. Bu kılavuzda, aracın nasıl kullanılacağı ayrıntılı olarak açıklanmaktadır.
Navigasyon
Hangi kullanıcı arayüzü çerçevesini kullandığınızdan bağımsız olarak, bir hedefe gitmek için kullanabileceğiniz tek bir işlev vardır: NavController.navigate().
navigate() için birçok aşırı yükleme seçeneği vardır. Seçmeniz gereken aşırı yük, tam olarak bağlamınıza karşılık gelir. Örneğin, bir composable'a giderken bir aşırı yükleme, bir görünüme giderken ise başka bir aşırı yükleme kullanmanız gerekir.
Aşağıdaki bölümlerde, kullanabileceğiniz bazı önemli navigate() aşırı yüklemeleri özetlenmiştir.
Bir composable'a gitme
Bir composable'a gitmek için NavController.navigate<T> kullanmanız gerekir.
Bu aşırı yükleme ile navigate(), türünü ilettiğiniz tek bir route bağımsız değişkenini alır. Hedefe ulaşmak için anahtar görevi görür.
@Serializable
object FriendsList
navController.navigate(route = FriendsList)
Gezinme grafiğindeki bir composable'a gitmek için önce NavGraph öğenizi her hedef bir türe karşılık gelecek şekilde tanımlayın. Birleştirilebilir işlevler için composable() işlevini kullanırsınız.
Composable işlevlerinizdeki etkinlikleri kullanıma sunma
Bir composable işlevin yeni bir ekrana gitmesi gerektiğinde, doğrudan navigate() işlevini çağırabilmesi için NavController referansı iletmeyin.
Tek Yönlü Veri Akışı (UDF) ilkelerine göre, composable bunun yerine NavController tarafından işlenen bir etkinlik göstermelidir.
Daha doğrudan ifade etmek gerekirse composable'ınızın () -> Unit türünde bir parametresi olmalıdır.
composable() işlevini kullanarak NavHost öğenize hedefler eklediğinizde, composable'ınıza NavController.navigate() öğesine yapılan bir çağrı iletin.
Bunun bir örneği için aşağıdaki alt bölüme bakın.
Örnek
Önceki bölümlerde anlatılanları göstermek için aşağıdaki snippet'te bu noktalara dikkat edin:
- Grafikteki her hedef, bir rota kullanılarak oluşturulur. Rota, söz konusu hedef için gereken verileri açıklayan, serileştirilebilir bir nesne veya sınıftır.
MyAppNavHostcomposable'ı,NavControllerörneğini tutar.- Bu nedenle,
navigate()işlevine yapılan çağrılar burada gerçekleşmeli veProfileScreengibi daha düşük bir composable işlevinde gerçekleşmemelidir. ProfileScreen, tıklandığında kullanıcıyıFriendsListadresine yönlendiren bir düğme içeriyor. Ancaknavigate()yöntemini kendisi çağırmaz.- Bunun yerine, düğme
onNavigateToFriendsparametresi olarak sunulan bir işlevi çağırır. MyAppNavHost, gezinme grafiğineProfileScreeneklediğindeonNavigateToFriendsiçinnavigate(route = FriendsList'ü çağıran bir lambda geçirir.- Bu, kullanıcının
ProfileScreendüğmesine bastığındaFriendsListScreensayfasına doğru şekilde yönlendirilmesini sağlar.
@Serializable
object Profile
@Serializable
object FriendsList
@Composable
fun MyAppNavHost(
modifier: Modifier = Modifier,
navController: NavHostController = rememberNavController(),
) {
NavHost(
modifier = modifier,
navController = navController,
startDestination = Profile
) {
composable<Profile> {
ProfileScreen(
onNavigateToFriends = { navController.navigate(route = FriendsList) },
/*...*/
)
}
composable<FriendsList> { FriendsListScreen(/*...*/) }
}
}
@Composable
fun ProfileScreen(
onNavigateToFriends: () -> Unit,
/*...*/
) {
/*...*/
Button(onClick = onNavigateToFriends) {
Text(text = "See friends list")
}
}
Tam sayı kimliği kullanarak gezinme
Hedefe tam sayı kimliği kullanarak gitmek için navigate(int)
aşırı yüklemesini çağırın. Bir işlemin veya hedefin kaynak kimliğini alır. Aşağıdaki kod snippet'i, ViewTransactionsFragment öğesine gitmek için bu aşırı yüklemeyi nasıl kullanabileceğinizi gösterir:
Kotlin
viewTransactionsButton.setOnClickListener { view ->
view.findNavController().navigate(R.id.viewTransactionsAction)
}
Java
viewTransactionsButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Navigation.findNavController(view).navigate(R.id.viewTransactionsAction);
}
});
Kimlikleri kullanarak gezinirken mümkün olduğunda işlemleri kullanmanız gerekir. İşlemler, gezinme grafiğinizde ek bilgiler sağlar ve hedeflerinizin birbirine nasıl bağlandığını görsel olarak gösterir.
NavDeepLinkRequest kullanarak gezinme
Kapalı derin bağlantı hedefine gitmek için navigate(NavDeepLinkRequest) aşırı yüklemesini kullanın. Aşağıdaki snippet'te bu yöntemin uygulanması gösterilmektedir:
Kotlin
val request = NavDeepLinkRequest.Builder
.fromUri("android-app://androidx.navigation.app/profile".toUri())
.build()
findNavController().navigate(request)
Java
NavDeepLinkRequest request = NavDeepLinkRequest.Builder
.fromUri(Uri.parse("android-app://androidx.navigation.app/profile"))
.build()
NavHostFragment.findNavController(this).navigate(request)
İşlem veya hedef kimlikleri kullanılarak yapılan navigasyonun aksine, hedef görünür olsun ya da olmasın grafiğinizdeki herhangi bir derin bağlantıya gidebilirsiniz. Mevcut grafikteki bir hedefe veya tamamen farklı bir grafikteki bir hedefe gidebilirsiniz.
İşlemler ve MIME türleri
Uri'ya ek olarak NavDeepLinkRequest, işlemler ve MIME türleri içeren derin bağlantıları da destekler. İsteğe işlem eklemek için fromAction() veya setAction() kullanın. İsteğe MIME türü eklemek için fromMimeType() veya setMimeType() kullanın.
Bir NavDeepLinkRequest öğesinin kapalı derin bağlantı hedefiyle düzgün şekilde eşleşmesi için URI, işlem ve MIME türünün hedefteki NavDeepLink ile eşleşmesi gerekir. URI'ler kalıpla eşleşmeli, işlemler tam olarak eşleşmeli ve MIME türleri ilişkili olmalıdır. Örneğin, image/jpg ile image/\* eşleşir.
Diğer bağlamlar
Bu belgede, NavController.navigate()'nin en yaygın kullanım alanlarında nasıl kullanılacağı açıklanmaktadır. Ancak işlevin, farklı bağlamlarda ve herhangi bir kullanıcı arayüzü çerçevesiyle birlikte kullanabileceğiniz bir dizi aşırı yüklemesi vardır. Bu aşırı yüklemeler hakkında daha fazla bilgi için
referans belgelerine bakın.
Daha fazla bilgi
Daha fazla bilgi için aşağıdaki sayfalara bakın:
- Gezinme denetleyicisi oluşturma
- Gezinme ve geri yığını
- Seçeneklerle gezinme
- Kotlin DSL ve Navigation Compose'da tür güvenliği