【问题标题】:Jetpack navigation initiating previous screenJetpack 导航启动上一个屏幕
【发布时间】:2020-03-29 09:09:23
【问题描述】:

我有这个由 3 个屏幕组成的简单导航设置:

Screen 1 -> Screen 2 -> Screen 3
    |______________________^

屏幕2是填写一次即可跳过的注册表单。

我有一个 Jetpack 导航图的奇怪问题,当从屏幕 2 -> 3 导航时,应用程序由于屏幕 1 (!) onViewCreated() 已激活而崩溃,并且找不到导航方向:

    java.lang.IllegalArgumentException: navigation destination 
com.example.app:id/action_screen1_to_screen3 is unknown to this NavController

我的导航图:

   <fragment
        android:id="@+id/screen1"
        android:name="Screen1Fragment"
        android:label="Screen 1"
        tools:layout="@layout/fragment_screen_1">
        <action
            android:id="@+id/action_screen1_to_screen2"
            app:destination="@id/screen2"
            app:launchSingleTop="false"/>
        <action
            android:id="@+id/action_screen1_to_screen3"
            app:destination="@id/screen3"
            app:launchSingleTop="false"
            app:popUpTo="@id/screen1"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/screen2"
        android:name="Screen2Fragment"
        android:label="Screen 2"
        tools:layout="@layout/fragment_screen_2">
        <action
            android:id="@+id/action_screen2_to_screen3"
            app:destination="@id/screen3"
            app:launchSingleTop="false"
            app:popUpTo="@id/screen2"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/screen3"
        android:name="Screen3Fragment"
        android:label="Screen 3"
        tools:layout="@layout/fragment_screen_3">
    </fragment>

我使用的是自动生成的 NavDirections,所以这不是使用错误资源 ID 的问题。

导航代码:

// Screen 1
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        if (isLoggedIn) {
            view?.findNavController()
                ?.navigate(Screen1FragmentDirections.screen1ToSelectScreen3())
        } else {
            signInButton.setOnClickListener {
                val action =
                    Screen1FragmentDirections.screen1ToScreen2()
                view?.findNavController()?.navigate(action)
            }
        }
    }

// Screen 2
view?.findNavController()?.navigate(Screen2FragmentDirections.screen2ToScreen3())

我的 Gradle 导入:

    def nav_version = "2.3.0-alpha04"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

感谢任何帮助,谢谢!

【问题讨论】:

  • 您可以尝试添加这个顶级变量:val navController = Navigation.findNavController(activity, R.id.nav_host_fragment) 并通过调用navController.navigate 更改view?.findNavController().navigate
  • 刚刚尝试像您建议的那样使用单个 navController,结果相同(无论如何我只有一个 navHost)。
  • 知道为什么首先调用 Screen 1 吗?是popUpTo吗?
  • 看来这个问题是已知的,这里有几篇文章可能对您有所帮助,stackoverflow.com/questions/51060762/…, stackoverflow.com/questions/51887968/…, stackoverflow.com/questions/54689361/…
  • 感谢@Biscuit 的帮助!这不是问题,但会导致解决方法。

标签: android android-jetpack android-jetpack-navigation


【解决方案1】:

不知道为什么会这样,但我找到的解决方案是在当前屏幕之前不是 popUpTo,而是 popUpTo 整个导航图:

[...]
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true"
[...]

【讨论】:

    猜你喜欢
    • 2022-12-04
    • 2018-12-30
    • 2023-01-24
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多