Android导航组件在配置更改后重置为起始目的地

5
我正在使用Android导航组件,有一个包含三个片段的活动。如果我在第二个片段并旋转屏幕以强制重启活动,则导航返回到起始目的地。navhostFragment是否应该保留图形的状态当活动重新启动时?这里发生的是默认行为吗?我不想添加以下内容,即使添加它也可以“工作”。
 android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"

因为我不想自己处理方向变化,我希望它能被系统正常处理并仍保留导航状态。
如果有需要,我会提供我的一些代码。
在活动中,我使用navController.setGraph(),这样我就可以像这样将数据传递到起始目的地。
 navController = Navigation.findNavController(
        this,
        R.id.nav_host_fragment
    )
 setSupportActionBar(findViewById(R.id.toolbar))
 appBarConfiguration = AppBarConfiguration.Builder(navController.graph).build()
 supportActionBar?.setDisplayHomeAsUpEnabled(true)

 intent.putExtra("EXTRA_KEY","some_data")
 navController.setGraph(R.navigation.nav_graph,intent.extras)

我使用这个方法从片段导航到另一个片段

navController.navigate(FirstFragmentDirections.actionFirstFragmentToSecondFragment())

这是在导航图中的代码

<fragment
    android:id="@+id/FirstFragment"
    android:name="com.example.app.presentation.ui.FirstFragment"
    android:label="FirstFragment" >
    <action
        android:id="@+id/action_FirstFragment_to_secondFragment"
        app:destination="@id/secondFragment"
        app:enterAnim="@anim/enter_from_right"
        app:exitAnim="@anim/exit_to_left"
        app:popEnterAnim="@anim/enter_from_left"
        app:popExitAnim="@anim/exit_to_right"
        />
</fragment>
<fragment
    android:id="@+id/secondFragment"
    android:name="com.example.app.presentation.ui.secondFragment"
    android:label="secondFragment"
    tools:layout="@layout/fragment_second" />

非常感谢您的帮助。

1个回答

9

通常情况下,您不需要自行调用setGraph()方法,但在这种特定情况下,您可以这样绕过它(而且实际上仍然按照您的预期工作,因为NavController / Navigator会自动跨配置更改和进程死亡恢复状态):

if (savedInstanceState == null) {
    navController.setGraph(R.navigation.nav_graph,intent.extras)
}

谢谢,我尝试了一下,问题解决了。 所以,在onCreate中设置图形会导致重置。 非常感谢。 - amjad masri
这个 intent.extras 是什么?我们要传递什么进去? - Abraham Mathew
传递给初始目标的参数,我认为。 - EpicPandaForce
1
嗨@EpicPandaForce,我也遇到了导航图在恢复应用程序(单活动应用程序)时被重置的问题。为了解决这个问题,我需要把上面的代码放在哪里? - TheLoy
@TheLoy 我需要看到更多你的代码,了解你如何在Activity或Fragment中初始化NavHostFragment和图表。我建议你开一个新问题,然后在这里发布一个评论带上你的链接,我会看一下。通常情况下,你不需要编程设置图表,但如果你确实需要,可以在Activity.onCreate甚至Fragment.onCreate中进行(使用onCreateView会导致错误,所以你也必须在onCreate中添加NavhostFragment,非常hacky,我有一个例子)。 - EpicPandaForce
@EpicPandaForce 谢谢您的回复。我在这里开了一个新的问题:https://stackoverflow.com/questions/72196230/android-navigation-graph-resets-onresume - TheLoy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接