Навигация Просмотр Глобальное действие Назад Состояние

Я возился с компонентом Jetpack Navigation и создал действие, использующее панель навигации.

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)

}

Это работает так, как я ожидал, но затем я добавил глобальное действие для экрана настроек.

<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)


Согласно _ 1_ документация (как NavigationUI запускает меню элементы):

По умолчанию задний стек будет возвращен в начальную точку навигационного графа. Пункты меню, у которых есть android:menuCategory="secondary", не будут выталкиваться назад.

Таким образом, вы можете добавить android:menuCategory="secondary" в свой пункт меню, если не хотите, чтобы другие места назначения выскакивали из стека при выборе места назначения для настроек.

person ianhanniballake    schedule 21.05.2019
comment
Просто из любопытства - есть ли разумный аргумент, почему это не поведение по умолчанию? Для меня это совершенно не интуитивно понятно. В любом случае спасибо за этот ответ! - person Gazeciarz; 26.02.2021