Я использую Компоненты архитектуры навигации 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'
}