Bir hedefe gitme

Navigasyon bileşeni, e-tablolara ulaşmak için bir hedefe gitmeyi içerir. Bu arayüz çeşitli bağlamları ve kullanıcı arayüzünü destekler. çerçeveleri. Örneğin, Gezinme bileşenini Oluştur, etkinlikleri ve hatta özel kullanıcı arayüzü çerçevelerini kullanabilir.

Bu kılavuzda, bir alana gitmek için Navigasyon bileşenini nasıl hedef olarak nitelendirilebilir.

NavController kullanma

Hedefler arasında geçiş yapmak için kullandığınız anahtar türü NavController'dır. Sınıfın kendisi hakkında daha fazla bilgi edinmek için Gezinme denetleyicisi oluşturma başlıklı makaleye bakın. örnek oluşturacağız. Bu kılavuzda, bu özelliğin nasıl kullanılacağı açıklanmaktadır.

Hangi kullanıcı arayüzü çerçevesini kullanırsanız kullanın, kullanabileceğiniz tek bir işlev vardır bir hedefe gitmek için: NavController.navigate().

navigate() için çok sayıda aşırı yükleme var. Gereken aşırı yüklenme tam olarak doğru bağlama uygun olduğunu seçin. Örneğin, dönüşüm izlemeyi bir composable'a giderken ve bir başka görünüme giderken aşırı yüklenmeye yol açabilir.

Aşağıdaki bölümlerde, uygulayabileceğiniz önemli navigate() aşırı yüklemelerinden bazıları açıklanmaktadır pek de iyi olmadığını unutmayın.

Bir composable'a git

Bir composable'a gitmek için NavController.navigate<T> komutunu kullanmanız gerekir. Bu aşırı yüklenmeyle navigate(), tek bir route bağımsız değişkeni alır. bir tür geçmektir. Hedefin anahtarıdır.

@Serializable
object FriendsList

navController.navigate(route = FriendsList)

Gezinme grafiğinde bir composable'a gitmek için önce NavGraph ile her hedef bir türe karşılık gelir. Örneğin, composable'da bunu composable() işleviyle yapıyorsunuz.

composable'larınızdaki etkinlikleri kullanıma sunma

Bir composable işlevinin yeni bir ekrana gitmesi gerektiğinde doğrudan navigate() öğesini çağırabilmesi için NavController öğesine referans verir. Tek Yönlü Veri Akışı (UDF) ilkelerine göre, composable bunun yerine NavController tarafından işlenen bir etkinliği görüntülemelidir.

Daha doğrudan bir ifadeyle, composable'ınızın () -> Unit türünde bir parametresi olmalıdır. NavHost cihazınıza composable() ile hedef eklediğinizde fonksiyonunuz için composable çağrınızı NavController.navigate() adresine iletin.

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

Örnek

Önceki bölümlerin gösterimi olarak bu noktaları aşağıdaki snippet:

  1. Grafikteki her hedef, bir rota kullanılarak oluşturulur. bu işlem için gereken verileri tanımlayan serileştirilebilir nesne veya sınıf seçeceğiz.
  2. MyAppNavHost composable, NavController örneğini barındırır.
  3. Buna göre, navigate() çağrıları orada değil, daha düşük düzeyde yapılmalıdır composable (ProfileScreen gibi).
  4. ProfileScreen, kullanıcıyı FriendsList adresine yönlendiren bir düğme içerir tıklayın. Ancak navigate() kendisini çağırmaz.
  5. Bunun yerine düğme, parametre olarak sunulan bir işlevi çağırır onNavigateToFriends
  6. MyAppNavHost tarafından gezinme grafiğine ProfileScreen eklendiğinde, onNavigateToFriends ise navigate(route = FriendsList adlı bir lambdadan geçer.
  7. Bu, kullanıcı ProfileScreen düğmesine bastığında FriendsListScreen adresine doğru rotayı izleme.
@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ğini kullanarak gezin

Tam sayı kimliği kullanarak bir hedefe gitmek için navigate(int) işlevini çağırın aşırı yüklenme. Bir işlemin veya hedefin kaynak kimliğini alır. İlgili içeriği oluşturmak için kullanılan aşağıdaki kod snippet'i, ViewTransactionsFragment:

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şlem kullanmanız gerekir. Eylemler gezinme grafiğinizde, ne kadar hızlı olduğunu gösteren ek bilgiler sağlar. hedefleri birbirleriyle bağlantılandırıyor.

NavDeepLinkRequest kullanarak gezin

Örtülü derin bağlantı hedefine gitmek için navigate(NavDeepLinkRequest) aşırı yüklenme. Aşağıdaki snippet, uygulayabilirsiniz:

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, istediğiniz derinliğe bağlantısını tıklayın. Şunları yapabilirsiniz: mevcut grafikteki bir hedefe veya tamamen farklı bir grafiktir.

İşlemler ve MIME türleri

NavDeepLinkRequest, Uri'a ek olarak şunlara sahip derin bağlantıları da destekler: işlemlerini ve MIME türlerini içerir. İsteğe bir işlem eklemek için şunu kullanın: fromAction() veya setAction(). Bir isteğe MIME türü eklemek için: fromMimeType() veya setMimeType() kullanın.

NavDeepLinkRequest öğesinin örtülü derin bağlantı hedefini doğru şekilde eşleştirmesi için URI, eylem ve MIME türünün NavDeepLink seçeceğiz. URI'lar kalıpla eşleşmeli, işlemler tam olarak eşleşmeli, ve MIME türlerinin ilişkili olması gerekir. Örneğin, image/jpg şununla eşleşir: image/\*

Diğer bağlamlar

Bu dokümanda, NavController.navigate()'in en yaygın şekilde nasıl kullanılacağı yaygın kullanım alanlarına bakalım. Ancak fonksiyonda kendi uygulayabileceğiniz bir dizi aşırı yükleme vardır. herhangi bir kullanıcı arayüzü çerçevesiyle birlikte kullanılıyor. Bkz. referans belgelerine bakın.

Daha fazla bilgi

Daha fazla bilgi için aşağıdaki sayfalara bakın: