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.
Rota İzleme
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
Bir composable'a gitmek için NavController.navigate<T>
kullanmanız gerekir.
Bu aşırı yüklemeyle birlikte navigate()
, bir türü ilettiğiniz tek bir route
bağımsız değişkeni alır. Hedefin anahtarı olarak işlev görür.
@Serializable
object FriendsList
navController.navigate(route = FriendsList)
Gezinme grafiğinde bir composable'a gitmek için önce NavGraph
öğenizi, her hedef bir türe karşılık gelecek şekilde tanımlayın. composable'lar için bu işlemi composable()
işleviyle yapabilirsiniz.
composable'larınızdan etkinlikleri kullanıma sunun
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 bir örneği için aşağıdaki alt bölüme bakın.
Örnek
Önceki bölümlerin tanıtımı olarak aşağıdaki snippet'te bu noktalara dikkat edin:
- Grafikteki her hedef bir rota kullanılarak oluşturulur. Rota, söz konusu hedefin gerektirdiği verileri açıklayan, seri hale getirilebilen bir nesne veya sınıftır.
MyAppNavHost
composable,NavController
örneğini barındırır.- Buna göre,
navigate()
çağrıları buradaProfileScreen
gibi daha düşük bir composable'da değil burada gerçekleşmelidir. ProfileScreen
, tıklandığında kullanıcıyıFriendsList
sayfasına yönlendiren bir düğme içerir. Ancaknavigate()
kendisine çağrılmaz.- Bunun yerine, düğme
onNavigateToFriends
parametresi olarak sunulan bir işlevi çağırır. MyAppNavHost
, gezinme grafiğineProfileScreen
eklediğindeonNavigateToFriends
içinnavigate(route = FriendsList
çağıran bir lambda geçirir).- Bu, kullanıcı
ProfileScreen
düğmesine bastığındaFriendsListScreen
öğesine doğru şekilde gitmesini 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 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:
- Gezinme denetleyicisi oluşturma
- Gezinme ve arka yığın
- Seçeneklerle gezinme
- Kotlin DSL ve Gezinme Yazma'da tür güvenliği