Bir hedefe gitme

Gezinme bileşeni, bir hedefe ulaşmak için basit ve genel bir yol sağlar. Bu arayüz, çeşitli bağlamları ve kullanıcı arayüzü çerçevelerini destekler. Örneğin, Gezinme bileşenini Oluştur, 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 Gezinme 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 şeklindedir. Sınıfın kendisi ve bunun bir örneğini nasıl oluşturacağınız hakkında daha fazla bilgi edinmek için Gezinme denetleyicisi oluşturma bölümüne bakın. Bu kılavuzda, özelliğin nasıl kullanılacağı bu kılavuzda açıklanmıştır.

Kullandığınız kullanıcı arayüzü çerçevesi ne olursa olsun, bir hedefe gitmek için kullanabileceğiniz tek bir işlev vardır: NavController.navigate().

navigate() için çok sayıda aşırı yükleme var. 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 özetlenmektedir.

Bir composable'a gitme

Gezinme grafiğinde bir composable'a gitmek için NavController.navigate(route) işlevini kullanın. Bu aşırı yüklemeyle birlikte navigate(), tek bir String bağımsız değişkeni alır. Bu, route. Hedefin anahtarı olarak işlev görür.

navController.navigate("friendslist")

Bir route dizesi kullanarak gezinmek için öncelikle NavGraph öğenizi, her hedef bir route ile ilişkilendirilecek şekilde oluşturmanız gerekir. composable'larda bu işlemi composable() işleviyle yapabilirsiniz.

Daha fazla bilgi için Hedefe gitme konusuna bakın.

composable bir işlevin yeni bir ekrana gitmesi gerektiğinde, doğrudan navigate() çağrısı yapabilmesi için işleve NavController referansı iletmemeniz gerekir. Çok Yönlü Veri Akışı (UDF) ilkelerine göre, composable bunun yerine NavController tarafından işlenen bir etkinliği göstermelidir.

Daha doğrudan belirtmek gerekirse composable, () -> Unit türünde bir parametreye sahip olmalıdır. NavHost öğenize composable() işlevini kullanarak hedefler eklediğinizde composable çağrınızı NavController.navigate() öğesine iletin.

Bunun net bir örneği için aşağıdaki alt bölüme bakın.

Önceki bölümün tanıtımı olarak aşağıdaki snippet'te şu noktalara dikkat edin:

  1. MyAppNavHost composable, NavController örneğini barındırır.
  2. Buna göre, navigate() çağrıları burada ProfileScreen gibi daha düşük bir composable'da değil burada gerçekleşmelidir.
  3. ProfileScreen, tıklandığında kullanıcıyı FriendsList sayfasına yönlendiren bir düğme içerir. Ancak navigate() kendisine çağrılmaz.
  4. Bunun yerine, düğme onNavigateToFriends parametresi olarak sunulan bir işlevi çağırır.
  5. MyAppNavHost gezinme grafiğine ProfileScreen eklediğinde onNavigateToFriends için navigate() çağıran bir lambda geçirir.
  6. Bu, kullanıcı ProfileScreen düğmesine bastığında friendsList öğesine doğru şekilde gitmesini sağlar.
@Composable
fun MyAppNavHost(
    modifier: Modifier = Modifier,
    navController: NavHostController = rememberNavController(),
    startDestination: String = "profile"
) {
    NavHost(
        modifier = modifier,
        navController = navController,
        startDestination = startDestination
    ) {
        composable("profile") {
            ProfileScreen(
                onNavigateToFriends = { navController.navigate("friendsList") },
                /*...*/
            )
        }
        composable("friendslist") { FriendsListScreen(/*...*/) }
    }
}

@Composable
fun ProfileScreen(
    onNavigateToFriends: () -> Unit,
    /*...*/
) {
    /*...*/
    Button(onClick = onNavigateToFriends) {
        Text(text = "See friends list")
    }
}

Tam sayı kimliği kullanarak gezin

Tam sayı kimliği kullanarak bir hedefe gitmek için navigate(int) aşırı yükünü çağırın. Bir işlemin veya hedefin kaynak kimliğini alır. Aşağıdaki kod snippet'i, ViewTransactionsFragment hedefine gitmek için bu aşırı yükü 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 actions özelliğini kullanmalısınız. İşlemler, navigasyon grafiğinizde ek bilgiler sunarak hedeflerinizin birbirine nasıl bağlandığını görsel olarak gösterir.

NavDeepLinkRequest kullanarak gezinme

Örtülü derin bağlantı hedefine gitmek için navigate(NavDeepLinkRequest) aşırı yüklemesini kullanın. Aşağıdaki snippet, bu yöntemin bir uygulamasını sağlar:

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 kimliklerini kullanarak gezinmenin aksine, hedefin görünür olup olmamasından bağımsız olarak grafiğinizdeki herhangi bir derin bağlantıya gidebilirsiniz. Mevcut grafikte bir hedefe veya tamamen farklı bir grafik üzerinde farklı bir hedefe gidebilirsiniz.

İşlemler ve MIME türleri

Uri'nin yanı sıra NavDeepLinkRequest, işlemler ve MIME türleri içeren derin bağlantıları da destekler. İsteğe bir işlem eklemek için fromAction() veya setAction() işlevini kullanın. Bir isteğe MIME türü eklemek için fromMimeType() veya setMimeType() işlevini kullanın.

NavDeepLinkRequest öğesinin örtülü derin bağlantı hedefini düzgün bir şekilde eşleştirmesi için URI, işlem ve MIME türünün hedefteki NavDeepLink ile eşleşmesi gerekir. URI'lar 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, image/\* ile eşleşir

Diğer bağlamlar

Bu dokümanda, NavController.navigate()'in en yaygın kullanım alanlarında nasıl kullanılacağı açıklanmaktadır. Ancak işlev, farklı bağlamlarda ve herhangi bir Kullanıcı Arayüzü çerçevesiyle birlikte kullanabileceğiniz bir dizi aşırı yük içerir. 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: