【问题标题】:Navigation View Global Action Back State导航视图全局操作返回状态
【发布时间】:2019-05-21 16:52:20
【问题描述】:

我一直在搞乱 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,结果相同。

如何让导航组件在选择全局操作后正确保存其状态?

【问题讨论】:

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


    【解决方案1】:

    根据onNavDestinationSelected() documentationNavigationUI triggers menu items 是这样的):

    默认情况下,返回堆栈将被弹回导航图的起始目的地。带有android:menuCategory="secondary" 的菜单项不会弹出回栈。

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

    【讨论】:

    • 只是出于好奇 - 是否有任何合理的论据为什么这不是默认行为?对我来说,这完全不直观。无论如何,谢谢你的回答!
    • 谢谢,我在使用 DrawerLayout 和 BottomNavigation 时遇到了同样的问题,当使用抽屉布局导航到屏幕然后使用返回按钮时,底部导航的状态会丢失。
    猜你喜欢
    • 2017-07-04
    • 1970-01-01
    • 2011-08-16
    • 2020-07-24
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多