Bir hedefe gitme

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.

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:

  1. 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.
  2. MyAppNavHost composable'ı, NavController örneğini tutar.
  3. Bu nedenle, navigate() işlevine yapılan çağrılar burada gerçekleşmeli ve ProfileScreen gibi daha düşük bir composable işlevinde gerçekleşmemelidir.
  4. ProfileScreen, tıklandığında kullanıcıyı FriendsList adresine yönlendiren bir düğme içeriyor. Ancak navigate() yöntemini kendisi çağırmaz.
  5. Bunun yerine, düğme onNavigateToFriends parametresi olarak sunulan bir işlevi çağırır.
  6. MyAppNavHost, gezinme grafiğine ProfileScreen eklediğinde onNavigateToFriends için navigate(route = FriendsList'ü çağıran bir lambda geçirir.
  7. Bu, kullanıcının ProfileScreen düğmesine bastığında FriendsListScreen sayfası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: