我一直在使用Jetpack中的新导航API,但遇到了一个问题,无法找到令人满意的解决方案。
基本上,我正在创建的应用程序有大量不同的片段。大多数片段与后端通信,当它们这样做时,可以发现它们的会话已超时。发生这种情况时,我想跳转到登录片段。唯一的方法是为每个片段创建一个动作,将目标指向登录屏幕。这是很多重复代码,我宁愿避免。是否有更简单的方法来做到这一点?
我一直在使用Jetpack中的新导航API,但遇到了一个问题,无法找到令人满意的解决方案。
基本上,我正在创建的应用程序有大量不同的片段。大多数片段与后端通信,当它们这样做时,可以发现它们的会话已超时。发生这种情况时,我想跳转到登录片段。唯一的方法是为每个片段创建一个动作,将目标指向登录屏幕。这是很多重复代码,我宁愿避免。是否有更简单的方法来做到这一点?
对于这种用例,您可以使用全局操作。要创建全局操作,请在导航图中选择所需的目标。右键单击,然后在菜单中选择“添加操作”,并单击“全局”,这将在您的导航图根元素内创建一个全局操作:
<action android:id="@+id/action_global_signInFragment" app:destination="@id/signInFragment"/>
现在您可以通过调用 navigation() 方法并传递所需全局操作的 ID 来使用全局操作:
NavHostFragment.findNavController(this).navigate(R.id.action_global_signInFragment)
https://developer.android.com/topic/libraries/architecture/navigation/navigation-global-action
我更倾向于发布另一种更适合传递参数和数据的方式:
// Navigation Component
implementation "androidx.navigation:navigation-fragment-ktx:$navigationVersion"
implementation "androidx.navigation:navigation-ui-ktx:$navigationVersion"
在nav_graph.xml中添加一个全局操作,可以像@Alex发布的那样添加,也可以右键单击您的片段并添加操作->全局,如下所示
现在,在要前往此目标的片段中,只需调用NavGraphDirections并找到您的全局操作,如下所示
val action = NavGraphDirections.actionGlobalInternalLinkDispatcher()
findNavController().navigate(action)
val action = NavGraphDirections.actionGlobalInternalLinkDispatcher(myArgumentExample)
findNavController().navigate(action)
我建议在YouTube上观看这个视频,它会对你有所帮助 菜单和全局操作 - 使用导航组件入门 #6