我有 3 个活动:主要、登录、向导。
对于每个活动,我都有带有片段目的地的单独导航图。
Main Nav Graph 也有登录活动目的地,用于在注销时启动登录屏幕。
App 从 Action.MAIN 启动器意图启动时似乎可以正常工作。
但是我在使用 Deep Link 时遇到了问题。我想将 URI 添加到登录导航图(更改密码片段)。此导航图使用单独的 NavHostFragment。我使用了两种方法。
START DESTINATION
(登录片段目标)。这里还有后退按钮 NOT 正常工作,即完成应用程序而不是返回到主导航图主目的地。Login Activity Destination
中将深层链接添加到 Main Nav Graph
并且这里的“后退”按钮确实可以正常工作,我按预期登陆了“登录片段目标”。但是在这里我想手动导航到 Change Password Fragment Destination 并且我遇到了另一个问题,即 Intent Action.View with Uri 数据没有传送到这个登录活动目的地。它仅传递给托管主导航图的主活动。 总结一下。我认为由 Activity Destinations 连接的多个 Nav Graphs 之间的这种深层链接行为无法正常工作。我不知道是否有任何解决方案。
我能以某种方式从 NavController 检索深层链接参数(Uri 数据)吗?或者唯一的解决方案是从 getIntent().data 获取它?正如我所说,这里的 Intent 不会转发到最终目标 Activity,而只会转发到创建的 Activity 堆栈中的第一个 Activity。
现在我回到手动处理没有 Android 导航架构的深层链接,因为如果导航结构比具有单个 Activity 且只有内部 Fragment 导航的单个 Nav Graph 更复杂,它似乎没有用。
https://developer.android.com/guide/navigation/navigation-deep-link
要使用 NavController 检索深度链接参数,您可以调用
NavController.handleDeepLink()
方法并传入包含 URI 数据的 Intent。此方法将返回一个布尔值,指示 NavController 是否处理了 Intent。
如果 NavController 处理了 Intent,您可以通过调用
NavController.getBackStackEntry().getArguments()
方法来检索参数。这将返回一个包含 URI 中传递的参数的 Bundle 对象。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val navController = findNavController()
if (navController.handleDeepLink(requireActivity().intent)) {
val arguments = navController.currentBackStackEntry?.arguments
val userId = arguments?.getString("user_id")
val token = arguments?.getString("token")
// Use userId and token as needed
}
}
如果 NavController 没有按预期处理 Intent,您仍然可以在 Activity 的
getIntent().getData()
方法中从 onCreate()
检索深度链接参数。如果需要将参数传递给 Fragment,可以使用 Fragment.setArguments()
方法将它们添加到 Fragment 的参数包中。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val intentData = intent?.data
if (intentData != null) {
val userId = intentData.getQueryParameter("user_id")
val token = intentData.getQueryParameter("token")
val loginFragment = LoginFragment()
val arguments = Bundle().apply {
putString("user_id", userId)
putString("token", token)
}
loginFragment.arguments = arguments
supportFragmentManager.beginTransaction()
.replace(R.id.fragment_container, loginFragment)
.commit()
}
}