我正在为我的应用程序使用 Android 导航组件和 BottomNavigationBar。
实施
我有四个选项卡,我为每个选项卡创建了一个单独的导航图,并为身份验证相关片段创建了 1 个导航图(login_navigation)。我的导航图看起来像这样
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_nav_graph"
app:startDestination="@+id/login_navigation">
<include app:graph="@navigation/login_navigation" />
<include app:graph="@navigation/dashboard_navigation" />
<include app:graph="@navigation/documents_navigation" />
<include app:graph="@navigation/templates_navigation" />
<include app:graph="@navigation/settings_navigation" />
</navigation>
我的申请流程是这样的 login_navigation ->(如果用户已通过身份验证)->仪表板_导航,并打开仪表板,我正在使用此代码
findNavController().popBackStack()
findNavController().navigate(R.id.dashboard_navigation)
问题
如果我从仪表板 -> 文档 -> 仪表板,它会创建仪表板片段及其视图模型的新实例,并保留仪表板的旧实例。 如果我按回键,它将像这样清除新的仪表板实例 -> 文档 -> 旧仪表板实例
期待 每当我再次按下仪表板时,它不应该创建新实例,但应该打开旧实例。
我怎样才能实现这种行为。
因此,经过大量搜索和阅读文档,我想出了一个解决方案,在我看来,它比我之前的实现非常简洁,并且它解决了以下所有问题。
解决方案
nav_graph.xml
<?xml version="1.0" encoding="utf-8"?>
<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_nav_graph"
app:startDestination="@+id/splashFragment">
<!--Login Module Routes-->
<fragment
android:id="@+id/splashFragment"
android:name="ui.fragments.splash.SplashFragment"
tools:layout="@layout/fragment_splash"/>
....
<!--Dashboard Routes-->
<fragment
android:id="@+id/dashboard_fragment"
android:name="ui.fragments.dashboard.DashboardFragment"
android:label="@string/MAIN_MENU_DASHBOARD"
tools:layout="@layout/fragment_dashboard" />
....
<!--Documents Routes-->
<fragment
android:id="@+id/documents_fragment"
android:name="ui.fragments.documents.DocumentsFragment"
android:label="@string/MAIN_MENU_DOCUMENTS"
tools:layout="@layout/fragment_documents" />
...
<!--Templates Routes-->
<fragment
android:id="@+id/templates_fragment"
android:name="ui.fragments.templates.TemplatesFragment"
android:label="@string/SERVICE_PLAN_PAGE_LABEL_TEMPLATES"
tools:layout="@layout/fragment_templates" />
...
<!--Settings Routes-->
<fragment
android:id="@+id/settings_fragment"
android:name="ui.fragments.settings.SettingsFragment"
android:label="@string/MENU_SETTINGS"
tools:layout="@layout/fragment_settings">
<action
android:id="@+id/to_personal_info"
app:destination="@id/personalInfoFragment" />
</fragment>
.....
<!--Global Actions-->
<action
android:id="@+id/login_module_to_dashboard"
app:destination="@id/dashboard_fragment"
app:popUpTo="@id/splashFragment"
app:popUpToInclusive="true" />
<action
android:id="@+id/action_global_to_documents_fragment"
app:destination="@id/documents_fragment"
app:restoreState="true" />
<action
android:id="@+id/global_dashboard"
app:destination="@id/dashboard_fragment"
app:popUpTo="@id/dashboard_fragment"
app:popUpToSaveState="true"
app:restoreState="true" />
<action
android:id="@+id/global_documents"
app:destination="@id/documents_fragment"
app:popUpTo="@id/dashboard_fragment"
app:popUpToSaveState="true"
app:restoreState="true" />
<action
android:id="@+id/global_templates"
app:destination="@id/templates_fragment"
app:popUpTo="@id/dashboard_fragment"
app:popUpToSaveState="true"
app:restoreState="true" />
<action
android:id="@+id/global_settings"
app:destination="@id/settings_fragment"
app:popUpTo="@id/dashboard_fragment"
app:popUpToSaveState="true"
app:restoreState="true" />
</navigation>
底部导航视图设置
私人乐趣 setupNavigationComponent() { val BottomNavigationView: BottomNavigationView = binding.bottomNavView
val fragContainer =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
navController = fragContainer.navController
bottomNavigationView.apply {
setupWithNavController(navController)
setOnItemSelectedListener { item ->
when (item.itemId) {
R.id.dashboard_fragment -> {
navController.navigate(R.id.global_dashboard)
}
R.id.documents_fragment -> {
navController.navigate(R.id.global_documents)
}
R.id.templates_fragment -> {
navController.navigate(R.id.global_templates)
}
R.id.settings_fragment -> {
navController.navigate(R.id.global_settings)
}
}
true
}
}
}