我试图通过单击底部导航栏上设置的按钮来启动活动。有一个使用
NavGraphBuilder.navigation()
设置的撰写导航,并为每个撰写屏幕调用 composable()
,例如:
navigation(
startDestination = "home",
route = "main"
) {
composable("home") {
HomeScreen(...)
}
// Several more Screens
}
我发现了
NavGraphBuilder.activity()
,所以我在想:
activity("tickets") {
this.activityClass = ExternalActivity::class
}
如果ExternalActivity不需要向其传递任何数据,它就可以工作。但确实如此。
想到的唯一可行的选择是使用
composable()
并从那里启动活动:
composable("tickets") { backStackEntry ->
val config = // get config from arguments
context.startActivity(
Intent(context, ExternalActivity::class.java).apply {
putExtra("config", config)
}
)
}
或者类似的东西。但它有点混乱并且有一些副作用,所以我想避免它。
有没有办法使用
activity()
调用并将数据传递给正在启动的 Activity?
我受到我所工作的代码库架构的限制,所以是的,它需要是一个 Activity(它实际上来自外部库)。
谢谢。
唯一与您正在尝试做的事情有点相似的是
data
。
activity("tickets") {
this.activityClass = ExternalActivity::class
this.data = "Hello World".toUri() <--
}
[ExternalActivity]
override fun onCreate(savedInstanceState: Bundle?) {
...
val data = intent.data
但是
data
是 Uri
,所以它可能不适合您的需求,特别是当您正在处理外部库时。那么 context.startActivity()
将是下一个选择,就像你的第二种方法一样。
需要注意的一件事是,当您使用
context.startActivity()
(而不是 NavGraphBuilder.activity()
)时,您需要在 Activity 关闭时正确设置“当前”目的地(例如,调用 navController.navigateUp()
或 navController.popBackStack()
)。如果没有,它会跳回您刚刚关闭的 Activity,因为就 NavController 而言,您启动(现在关闭)的 Activity 就是当前目的地。
您必须提供额外内容作为参数:
activity("tickets/{EXTRA_NAME}") {
argument("EXTRA_NAME") { type = NavType.StringType }
activityClass = ExternalActivity::class
}
然后您可以通过以下方式导航至活动:
navController.navigate("tickets/EXTRA_VALUE")
一切都在那里:https://developer.android.com/guide/navigation/design/kotlin-dsl#args