Компоненты навигационной архитектуры Android: неправильный стэк с NavigationView - PullRequest
0 голосов
/ 18 октября 2018

Я использую Компоненты архитектуры навигации Android для навигации по приложениям, основанным на фрагментах.Основная навигация реализована с помощью шаблона NavigationDrawer: DrawerLayout с NavigationView и NavHostFragment plus и дополнительной панелью инструментов.

Пока все работает нормально - я могу переходить к каждому фрагменту - за исключением BackStack основногоФрагментыКажется, что любой фрагмент, кроме startDestination, добавляется в BackStack, а не заменяется, как это делал бы обычный NavigationDrawer.

Неправильное поведение может быть идентифицировано с помощью значка Burger, который переключается на значок Back, как только я перехожу к фрагменту, отличному от startDestination, и путем перехода назад, который приводит меня к startDestination вместо выхода изapp.

Как использовать компоненты архитектуры навигации для замены основных фрагментов в сочетании с NavigationView?

Я инициализирую компоненты архитектуры навигации следующим образом:

class MainActivity : AppCompatActivity {

    private val navigationHostFragment: NavHostFragment
        get() = supportFragmentManager.findFragmentById(R.id.navigationHost) as NavHostFragment

    private val navigationController: NavController
        get() = navigationHostFragment.navController

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

        // Views are bound via Kotlin Android Extensions
        setSupportActionBar(toolbar)
        NavigationUI.setupWithNavController(toolbar, navigationController, drawerLayout)
        NavigationUI.setupWithNavController(navigationView, navigationController)
    }

    override fun onSupportNavigateUp(): Boolean = findNavController(R.id.navigationHost).navigateUp()
}

Макет для действия (/res/layout/activity.xml) выглядит следующим образом:

<androidx.drawerlayout.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"/>

        <fragment
            android:id="@+id/navigationHost"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:navGraph="@navigation/navigation"
            app:defaultNavHost="true"/>

    </LinearLayout>

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/navigationView"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/navigation"/>

</androidx.drawerlayout.widget.DrawerLayout>

График навигации (/res/navigation/navigation.xml) выглядит следующим образом:

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

    <fragment
        android:id="@+id/first"
        android:name="de.example.FirstFragment"
        android:label="@string/first"/>

    <fragment
        android:id="@+id/second"
        android:name="de.example.SecondFragment"
        android:label="@string/second"/>

</navigation>

Меню для NavigationView (/res/menu/navigation.xml) выглядит следующим образом:

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

    <group android:checkableBehavior="single">

        <item
            android:id="@+id/first"
            android:title="@string/first"/>

        <item
            android:id="@+id/second"
            android:title="@string/second"/>

    </group>

</menu>

Соответствующие зависимости выглядят так:

dependencies {
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.core:core-ktx:1.0.0'
    implementation 'android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha06'
    implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0-alpha06'
}

1 Ответ

0 голосов
/ 25 октября 2018

Как Алекс опубликовал , моя первоначальная цель вступает в противоречие с Принципами навигации :

Приложения имеют фиксированное назначение, то есть экран, который видит пользователькогда они запускают ваше приложение из панели запуска.Этот пункт назначения также должен быть последним экраном, который видит пользователь, когда он возвращается в панель запуска после нажатия кнопки «Назад».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...