popBackStack() 在 android NavController 中不起作用

问题描述 投票:0回答:3

我正在使用 android JetPack 导航在我的片段之间导航。这就是我的

navigation graph
的样子

 <?xml version="1.0" encoding="utf-8"?><navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/registration_nav_graph"
app:startDestination="@id/registrationStoreNameFragment">

<fragment
    android:id="@+id/registrationStoreNameFragment"
    android:name="com.minidukaan.android.feature.registration.view.RegistrationStoreNameFragment"
    android:label="fragment_registration_store_name"
    tools:layout="@layout/fragment_registration_store_name" >
    <action
        android:id="@+id/action_registrationStoreNameFragment_to_registrationStoreUrlFragment2"
        app:destination="@id/registrationStoreUrlFragment2" />
</fragment>

<fragment
    android:id="@+id/registrationStoreUrlFragment2"
    android:name="com.minidukaan.android.feature.registration.view.RegistrationStoreUrlFragment"
    android:label="RegistrationStoreUrlFragment" >
    <action
        android:id="@+id/action_registrationStoreUrlFragment2_to_registrationLocationFragment"
        app:destination="@id/registrationLocationFragment" />
    <argument
        android:name="store_name"
        app:argType="string" />
    <argument
        android:name="store_slug"
        app:argType="string" />
</fragment>


<fragment
    android:id="@+id/registrationLocationFragment"
    android:name="com.minidukaan.android.feature.registration.view.RegistrationLocationFragment"
    android:label="fragment_registration_location"
    tools:layout="@layout/fragment_registration_location" >
    <action
        android:id="@+id/action_registrationLocationFragment_to_registrationSuccessFragment"
        app:destination="@id/registrationSuccessFragment" />
    <argument
        android:name="store_name"
        app:argType="string" />
    <argument
        android:name="store_slug"
        app:argType="string"
        android:defaultValue=""/>
</fragment>
<fragment
    android:id="@+id/registrationSuccessFragment"
    android:name="com.minidukaan.android.feature.registration.view.RegistrationSuccessFragment"
    android:label="fragment_registration_success"
    tools:layout="@layout/fragment_registration_success" />

RegistrationStoreNameFragment
我像这样导航到
RegistrationStoreUrlFragment

private lateinit var navController: NavController
override fun init(savedInstanceState: Bundle?) {
    super.init(savedInstanceState)
    ....

    binding.lifecycleOwner = this
    navController = view?.let { Navigation.findNavController(it) }!!
    val action = RegistrationStoreNameFragmentDirections.
                        actionRegistrationStoreNameFragmentToRegistrationStoreUrlFragment2(storeName, it.slug)
                            navController.navigate(action)

}

所以它可以完美导航,但是当我在

navController.popBackStack()
中执行
RegistrationStoreUrlFragment
时,它不会导航回来。任何帮助将不胜感激,因为我很长时间都陷入这个问题。

对于其他片段,popBackStack 工作正常,但不适用于上面提到的片段。

android android-jetpack android-navigation
3个回答
3
投票

您想什么时候导航?

如果您想在任何自定义事件中导航回之前添加的片段,

您必须在 NavGraph 中的 Fragment 标签下定义 popUpTo 操作,

<fragment
android:id="@+id/registrationStoreUrlFragment2"
android:name="com.minidukaan.android.feature.registration.view.RegistrationStoreUrlFragment"
android:label="RegistrationStoreUrlFragment" >
<action
        android:id="@+id/action_pop_back"
        app:destination="@id/registrationSuccessFragment"
        app:popUpTo="@+id/registrationSuccessFragment"/>
</fragment>

并在导航中这样调用它,

findNavController().navigate(R.id.action_pop_back)

0
投票

当前片段要返回 homeFragment

 findNavController().popBackStack(R.id.homeFragment, true)

这对我来说工作得很好。也许会对你有帮助


0
投票

对于我的情况,我遇到了同样的问题,我尝试了通过在

app:popUpTo
中设置
xml
给出的解决方案,但对我来说问题是后退按钮在这种情况下只能工作一次。 然后我用
app:popUpToSaveState
将其设置如下,现在来回工作正常:

<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/anonymous_navigation"
    app:startDestination="@id/startupFragment">

    <fragment
        android:id="@+id/landingFragment"
        android:name="com.myApp.ui.landing.LandingFragment"
        android:label="fragment_landing"
        tools:layout="@layout/fragment_landing" >
        <action
            android:id="@+id/action_landingFragment_to_loginFragment"
            app:destination="@id/loginFragment"
            app:popUpToSaveState="@id/landingFragment" />
    </fragment>
</navigation>

然后在代码中,当按下后退时我会调用

navigateUp

findNavController().navigateUp()
© www.soinside.com 2019 - 2024. All rights reserved.