按下 BottomNavigationBar 项目总是会创建一个实例,并将旧的实例保留在 backstack 中

问题描述 投票:0回答:1

我正在为我的应用程序使用 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)

问题

如果我从仪表板 -> 文档 -> 仪表板,它会创建仪表板片段及其视图模型的新实例,并保留仪表板的旧实例。 如果我按回键,它将像这样清除新的仪表板实例 -> 文档 -> 旧仪表板实例

期待 每当我再次按下仪表板时,它不应该创建新实例,但应该打开旧实例。

我怎样才能实现这种行为。

android bottomnavigationview android-architecture-navigation
1个回答
0
投票

因此,经过大量搜索和阅读文档,我想出了一个解决方案,在我看来,它比我之前的实现非常简洁,并且它解决了以下所有问题。

  1. 点击BottomNavigationView项,每次都会创建新实例
  2. 循环导航问题,旧实例保留在内存中,而不是 使用旧实例,应用程序创建了一个新实例
  3. 正确的后退堆栈处理和状态恢复,A -> B -> C 如果用户在底部导航视图中按下 A,它不会返回到 A,也不会弹出 C 和 B,而它应该有
  4. 它还为每个选项卡维护单独的后退堆栈

解决方案

  1. 我没有维护单独的导航图文件,而是将所有片段添加到一个文件中
  2. 我为每个选项卡创建了全局操作
  3. 重写 setOntemSelectedListener 并使用这些全局操作

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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.