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

amj*_*sri 4 android onconfigurationchanged android-architecture-components android-jetpack android-architecture-navigation

我正在使用 Android 导航组件,如果我在第二个片段中,我有一个包含三个片段的活动,并旋转屏幕强制活动重新启动导航返回到开始目的地。

当活动重新启动时,navhostFragment 不应该保留图形的状态吗?

或者这里发生了什么默认行为?

即使添加“有效”,我也不想添加以下内容

 android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
Run Code Online (Sandbox Code Playgroud)

因为不想自己处理方向变化,希望系统正常处理,还保留导航状态

如果有帮助,我会提供一些我的代码

在活动中我使用 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)
Run Code Online (Sandbox Code Playgroud)

我使用这个从片段导航到片段

navController.navigate(FirstFragmentDirections.actionFirstFragmentToSecondFragment())
Run Code Online (Sandbox Code Playgroud)

这是 nav_graph 中的代码

<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" />
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助

Epi*_*rce 5

您通常永远不需要调用setGraph()自己,但您可以在这种特殊情况下像这样解决它(实际上它仍然可以按您预期的那样工作,因为 NavController / Navigator 在配置更改时正确恢复状态并自动处理死亡):

if (savedInstanceState == null) {
    navController.setGraph(R.navigation.nav_graph,intent.extras)
}
Run Code Online (Sandbox Code Playgroud)