Android多模块嵌套导航如何从LoginFragment跨模块跳转至HomeFragment
解决方案
你可以通过以下两种方式实现跨嵌套导航图的跳转,两种方式都可以满足模块化场景下的跳转需求:
方案1:配置导航Action跳转(推荐)
该方式类型安全,支持统一配置转场动画、回退栈清理规则,后续维护成本更低:
- 修改
authentication模块的导航图staging_authentication_nav_graph.xml,在LoginFragment节点下添加跳转Action:
<fragment android:id="@+id/loginFragment" android:name="com.ocatave.featureauthentication.LoginFragment" android:label="login_fragment" tools:layout="@layout/login_fragment"> <!-- 新增跳转至home模块导航图的action --> <action android:id="@+id/action_loginFragment_to_homeNavGraph" app:destination="@id/staging_home_nav_graph" app:popUpTo="@id/staging_authentication_nav_graph" app:popUpToInclusive="true" /> </fragment>
这里配置
popUpTo的作用是登录成功后将认证模块的所有页面从回退栈中清除,避免用户按返回键回到登录页。
- 在
LoginFragment中登录成功的逻辑处调用跳转即可:
// Kotlin 代码示例 findNavController().navigate(R.id.action_loginFragment_to_homeNavGraph) // Java 代码示例 Navigation.findNavController(requireView()).navigate(R.id.action_loginFragment_to_homeNavGraph);
由于
staging_home_nav_graph的起始目的地已经配置为HomeFragment,跳转后会自动打开HomeFragment,无需额外指定页面。
方案2:直接指定目的地ID跳转(无需修改导航图)
如果不需要复用跳转规则,也可以直接在代码中指定跳转目标,配合NavOptions配置回退栈规则:
// Kotlin 代码示例 val navOptions = NavOptions.Builder() .setPopUpTo(R.id.staging_authentication_nav_graph, true) .build() findNavController().navigate(R.id.staging_home_nav_graph, null, navOptions)
// Java 代码示例 NavOptions navOptions = new NavOptions.Builder() .setPopUpTo(R.id.staging_authentication_nav_graph, true) .build(); Navigation.findNavController(requireView()).navigate(R.id.staging_home_nav_graph, null, navOptions);
注意事项
由于你的两个子导航图都已经在主导航图中通过<include>标签声明,所以在子模块中直接引用staging_home_nav_graph、staging_authentication_nav_graph这些ID都是可以正常识别的,不会出现资源找不到的问题。
内容的提问来源于stack exchange,提问作者WISHY
相关产品推荐
相关产品推荐

