导航视图全局操作返回状态

时间:2019-05-21 16:52:20

标签: android kotlin android-jetpack android-navigationview android-jetpack-navigation

我一直在搞弄Jetpack导航组件,并创建了一个使用导航抽屉的活动。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navigationController = findNavController(R.id.navigationHostFragment)
        navigationView.setupWithNavController(navigationController)

        val appBarConfiguration = AppBarConfiguration(TOP_LEVEL_DESTINATIONS, drawerLayout)
        toolbar.setupWithNavController(navigationController, appBarConfiguration)
    }

    override fun onSupportNavigateUp(): Boolean =
            NavigationUI.navigateUp(findNavController(R.id.navigationHostFragment), drawerLayout)

}

这可以按我期望的那样工作,但是随后我在设置屏幕上添加了global action

<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/main"
    app:startDestination="@id/appBarFragment">

    ...

    <activity android:id="@+id/settingsActivity"
        android:name="com.example.app.ui.SettingsActivity"
        android:label="@string/title_settings"/>

    <action android:id="@+id/settingsAction"
        app:destination="@+id/settingsActivity"/>

</navigation>

并在NavigationView菜单中引用操作。

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    ...

    <group android:id="@+id/navigationGroupSettings">

        <item android:id="@+id/aboutAction"
            android:title="@string/title_about"
            android:icon="@drawable/ic_info_black_24dp"/>

        <item android:id="@+id/settingsAction"
            android:title="@string/title_settings"
            android:icon="@drawable/ic_settings_black_24dp"/>

    </group>

</menu>

这将显示SettingsActivity,但是当我按返回按钮返回到MainActivity时,将显示第一个目的地,而不是先前的目的地。即使NavigationView正确保存了其状态,并检查了最后一个目的地(而不是列表中的第一项)。

我还尝试用SettingsActivity替换SettingsFragment,结果相同。

在选择了全局动作后,如何使导航组件正确保存其状态?

1 个答案:

答案 0 :(得分:1)

按照onNavDestinationSelected() documentationNavigationUI triggers menu items的方式):

  

默认情况下,后退堆栈将弹出回到导航图的起始目标位置。带有android:menuCategory="secondary"的菜单项不会弹出堆栈。

因此,如果您希望避免在选择设置目标位置时将其他目标位置弹出堆栈,则可以在菜单项中添加android:menuCategory="secondary"