在我们的代码中将Android导航组件与SAMF(单个活动,多个片段)方法一起使用以实现每个功能。假设每个功能都有自己的导航图,用于在它们之间进行导航。
例如,图形为 graph_a , graph_b , graph_c 并带有自己的片段,并按以下方式导航:
graph_a >> graph_b >> graph_c
,它按预期工作。 现在,在某些情况下,Fragment(frag_b)可能需要在不同的导航图中导航另一个,例如
frag_b(graph_b) >> frag_c(graph_a)
在这种情况下,我发现了最佳的解决方案,可以使用URI进行导航并在下面进行尝试。
val deepLink = Uri.parse("app://login/user-signup")
findNavController().navigate(deepLink)
并添加了以下 deeplink (在相应的图中称为片段)。
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/graph_login_flow"
app:startDestination="@id/userSignInFragment">
...
<fragment
android:id="@+id/userSignUpFragment"
android:name="com.app.login.ui.UserSignUpFragment"
android:label="EmailSignUpFragment"
tools:layout="@layout/fragment_user_sign_up">
<action
android:id="@+id/action_userSiUpFrag_to_emailVeriFrag"
app:destination="@id/emailVerificationFragment" />
<deepLink
android:id="@+id/deepLink_to_userSignUpFragment"
app:uri="app://login/user-signup" />
</fragment>
<include app:graph="@navigation/graph_home_flow" />
...
</navigation>
根据Android documentation,无论图形如何,都可以导航到任何目的地,但是我的尝试导致以下错误。 有没有更好的方法?
java.lang.IllegalArgumentException: navigation destination with deepLink app://login/user-signup is unknown to this NavController
at androidx.navigation.NavController.navigate(NavController.java:916)
at androidx.navigation.NavController.navigate(NavController.java:894)
at androidx.navigation.NavController.navigate(NavController.java:880)
at com.app.home.profile.ProfileFragment.onViewCreated(ProfileFragment.kt:82)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:298)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1232)
at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2390)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2125)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2081)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1977)