Android BottomNavigationView 与闪屏返回堆栈问题

2024-03-21

所以我设置了我的BottomNavigationView (like here https://youtu.be/Covu3fPA1nQ)使用导航组件库,一切正常,每个选项卡都可以保留其后堆栈。但是,如果我添加一个启动屏幕(Fragment) and:

  1. 将其设置为起始目的地(popUpInclusive已设置为 true)
  2. 创建动作来自飞溅片段到第一个选项卡主页片段

然后所有选项卡不再保留其后堆栈,而且导航变得很奇怪:

Splash -> Home(第一个选项卡)-> Me(第二个选项卡)-> Home -> 按返回,它会返回到“我”,而不是退出应用程序。

PS:我使用带有单个导航图的单个活动模式。


好的,感谢@ianhanniballake,我在这里发布了我的最终解决方案,关键是BottomNavigationView必须是起始目的地而不是其他目的地有条件的目的地 https://developer.android.com/guide/navigation/navigation-conditional例如登录或启动屏幕。


步骤 1. 创建并设置 Splash 布局和片段

  • Add SplashFragment进入导航图。

  • 无需创建动作HomeFragment -> SplashFragment,除非你需要过渡动画

步骤 2. 设置MainViewModel(共享ViewModel)

class MainViewModel : ViewModel() {
    private var _isFirstLaunch = true  //replace with the real condition in the future

    val isFirstLaunch: Boolean         //will be accessed by SplashFragment and HomeFragment
        get() = _isFirstLaunch

    fun updateIsFirstLaunch(isFirstLaunch: Boolean) {
        _isFirstLaunch = isFirstLaunch
    }
}

步骤 3. 设置HomeFragment

class HomeFragment : Fragment() {
    private lateinit var binding: FragmentHomeBinding
    private lateinit var mainViewModel: MainViewModel  //shared ViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false)
        mainViewModel = ViewModelProvider(requireActivity()).get(MainViewModel::class.java)

        if (mainViewModel.isFirstLaunch) {
            findNavController().navigate(R.id.splashFragment)   //no need action, unless you want transition animation
        }

        binding.goButton.setOnClickListener {
            findNavController().navigate(R.id.action_homeFragment_to_home2Fragment)
        }

        return binding.root
    }
}

步骤 4. 设置SplashFragment

class SplashFragment : Fragment() {
    private lateinit var binding: FragmentSplashBinding
    private lateinit var mainViewModel: MainViewModel  //shared ViewModel

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        binding = DataBindingUtil.inflate(inflater, R.layout.fragment_splash, container, false)
        mainViewModel = ViewModelProvider(requireActivity()).get(MainViewModel::class.java)

        binding.exitSplashButton.setOnClickListener {
            mainViewModel.updateIsFirstLaunch(false)  //update the condition

            findNavController().navigateUp()    //go back to HomeFragment
        } 

        requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
            requireActivity().finish()
        }

        return binding.root
    }
}

Demo: https://youtu.be/AxiIsY6BtGg https://youtu.be/AxiIsY6BtGg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android BottomNavigationView 与闪屏返回堆栈问题 的相关文章

  • 编辑时可以在文本框控件内使用 Angular 的管道格式化程序吗?

    我已经声明了一种将大数字分成三位数组的格式 并像这样经常使用它 div Huge number i am huge make threesome div 现在 有一个对相应功能的请求 但在像这样的输入控件中实现
  • 使用字符串数组在 Hive 表上加载 CSV 文件

    我正在尝试将 CSV 文件插入 Hive 其中一个字段是 string 数组 这是 CSV 文件 48 Snacks that Power Up Weight Loss Aidan B Prince Health Fitness Trave
  • 基于生产的 Azure SQL 数据库沙箱

    我有一个大型 Azure Sql 数据库 我需要向团队提供一个沙箱 它是数据库的副本 但允许他们创建 sql 对象 沙箱中的数据需要与生产保持同步 我使用了弹性查询 但是性能并不理想 我查看了数据同步 但公司要求 AD 身份验证 定期恢复生
  • 如何将 jsf 或 html 标签添加到 p:panel 的标头

  • 两种模型,一种是 STI,一种是验证

    假设我有两个表 产品和订单 为了简单起见 假设一次只能购买一种产品 因此没有像 order items 这样的连接表 所以关系是Product有很多订单 Order属于product 因此 product id是Order表中的一个fk 产
  • 通过 Ajax 加载内容

    好的 我对 ajax 和从外部加载内容还很陌生 如果您能深入了解我的问题 我将不胜感激 我目前有一个空的隐藏 div 单击链接后应在其中加载 ajax 内容 div div 我目前有一个链接列表 它们都具有相同的类 我希望在单击时 空白 d
  • PHP Session Id 在页面之间发生变化

    我有一个问题 我在 2 个页面之间丢失了 PHP 会话 session start 包含在一个名为 session inc php 的文件中 该文件包含在每个需要设置会话的页面中 这适用于网站上除一个特定页面 member profile
  • 使用 Hibernate 防止无限循环数据检索

    我想知道 想象一个场景 例如 POJO public class User private String userName private String name private String surname private List
  • 如何将上下文从一个活动传递到另一个活动?

    我有一个主要活动 它调用另一个活动来显示一些数据 我有一个私有数据库帮助程序对象 我在整个主要活动代码中使用它 有没有办法以优雅的方式将我的主要活动的上下文传递给我的子活动 即 来自子类 类似getCallingActivityContex
  • 如何让 DataTemplate.DataTrigger 检查大于或小于?

    下列DataTemplate DataTrigger如果是 则使年龄显示为红色equal to 30 如果是的话 如何使年龄显示为红色比 更棒 30
  • 如何在 C 中创建最低有效位设置为 1 的掩码

    这个功能如何运作 最低有效 n 位设置为 1 的掩码 Example n 6 gt 0x2F n 17 gt 0x1FFFF 我根本不明白这些 尤其是 n 6 gt 0x2F 另外 什么是面膜 通常的方法是采取1 并将其左移n位 这会给你类
  • cUrl 在本地主机上工作正常,但在服务器上不起作用,仅显示空白页面

    当我在服务器上运行以下代码时 它只显示空白页面并突然停止进一步执行 我还检查了已安装的服务器上的 cUrl 这是我的代码 ftp server ftps server Voorraadtonen link csv ch curl init
  • 表单帖子上的 asp.net mvc 编码

    我在我的 asp net mvc 表单 带有文本区域的 nicedit 中使用富文本编辑器 当我在帖子上提交表单时 因为它不是 html 编码的 我收到以下消息 从客户端检测到潜在危险的 Request Form 值 如何对 post 上的
  • 将自定义属性添加到 Tk 小部件

    我的主要目标是向小部件添加隐藏标签或字符串之类的内容 以在其上保存简短信息 我想到创建一个新的自定义 Button 类 在本例中我需要按钮 它继承所有旧选项 这是代码 form tkinter import class NButton Bu
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma
  • 将一个 IEnumerable 拆分为多个 IEnumerable

    我是 linq 新手 我需要根据指示器将 Couple string text bool Indicator 类型的 IEnumerable 拆分为多个 IEnumerable 我尝试使用skipWhile 和 TakeWhile 但没有找
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务
  • Fancybox修改。如何修改 fancybox 以停止在每个画廊的最后一项? (画廊 1 画廊 2 等)[重复]

    这个问题在这里已经有答案了 我正在为我的照片库使用 fancybox 插件 我有多个包含更多项目 照片 的画廊 我想知道如何在点击每个画廊的最后一个项目时停止幻灯片放映 我的 fancybox js 没有被修改 谢谢 您需要添加该选项loo
  • 安卓框架?

    是否有任何框架比构建 Android 应用程序更容易 您会对其中一个感兴趣吗 很快就会有 我正在开发 DroidFu 一个 Android 共享库 它将为您提供 活动 和服务 中直接提供大量实用功能 例如生成列表和错误对话框 检查 Inte
  • 使用 Coldfusion 的 CFFILE 标签监控 FFMpeg 的进度日志

    我想学习如何使用 ColdFusion 中的 CFFILE 标签来读取文本文件的内容 就我而言 该文本文件是 FFMpeg 在对媒体文件进行转码时生成的进度日志 我想编写一个 ColdFusion 脚本 该脚本将定期轮询进度日志 直到日志表

随机推荐

  • 在 Azure 中创建的 VM 上的 TenantEncryptionCert

    我创建了预安装 SQL Server 的 Azure VM 并配置了 IIS 以在其上运行我的 NET 应用程序 为我的应用程序配置 SSL 时 我注意到服务器上已经存在许多证书 其中相当一部分是租户加密证书由 Windows Azure
  • 在 Windows 剪贴板复制缓冲区中包含格式信息以粘贴到 Excel 中

    我的应用程序将表格数据写入 Windows 复制缓冲区 以便用户粘贴到 Excel 中 这适用于未格式化的表格数据 包括制表位以及单元格和行分隔符的新行 我想在复制缓冲区中包含格式化数据 网格线 背景颜色等 我可以这样做吗 如果可以 在哪里
  • 计算整个 GeoDataFrame 点的质心

    我想从 geojson 文件导入一些航路点 标记 然后确定所有点的质心 我的代码计算每个点的质心 而不是该系列中所有点的质心 如何计算系列中所有点的质心 import geopandas filepath r Shiloh json gdf
  • css - 显示:表格单元格和固定宽度[重复]

    这个问题在这里已经有答案了 我有一些divs with display table cell样式 我想在其上设置固定宽度divs并在内容不合适时截断其中的文本 HTML div class row div class cell style
  • 如何在 Postgres 9.5 中替换多个特殊字符

    我有一个包含可能包含特殊字符的名称列表的表 id name 1 Joh n 2 J rgen 3 Janna 4 dyr 是否有一个函数可以将每个字符替换为另一个特定字符 不一定是无重音的 像这样的事情 SELECT id function
  • Android 发现死锁

    当我运行 Android 服务时 有时会收到 ANR 我怀疑这是因为僵局而发生的 有没有一种简单的方法可以监控 Android 或 Eclipse 中的死锁 例如显示哪个线程持有哪个锁等的实用程序 有没有办法通过查看 traces txt
  • IntelliSense:命名空间“MSXML2”在 VS2012 中没有成员“DOMDocument”

    我正在尝试编译我继承的项目 然后遇到此错误 以下是一些相关代码 include
  • 如何将 JQuery 脚本添加到单个 WordPress 页面中?

    我想将 JQuery 脚本添加到单个 WordPress 页面中 但我不知道如何操作 我想注入的脚本示例 当以纯 HTML 形式注入时 此代码可以正常工作 但如何对 Wordpress 执行相同操作呢 我个人认为将 JavaScript 添
  • div CSS 上的右角功能区

    我正在尝试在 div 中制作一条角丝带 它无处不在 我希望它看起来整洁漂亮 但它覆盖了 div 坐得不太好 The ribbons corner ribbon width 100px background e43 position abso
  • 大型 Org-mode 文件中的光标移动缓慢以及“org-do-latex-and-lated”函数

    在一个几乎有 5000 行的 org 文件中 滚动速度慢得难以忍受 除非我转动font lock mode离开 检查发生了什么profiler 减速的主要原因是函数org do latex and related 定义于org el 似乎它
  • 如何使用 wlst 更新应用程序

    从控制台如果 1 要更新应用程序 1 所做的是 1 单击部署 2 选择应用程序名称并单击更新选项 3 这里他可能会改变 i Source Path ii Deployment Plan 现在 在我的应用程序中没有指定计划路径 因此要更新应用
  • Spring boot打包后找不到资源文件

    我使用 Spring boot maven 插件将应用程序打包为 jar 文件 可以找到资源文件直接在Intellij IDEA中运行 但之后找不到资源文件 显示错误为 java io FileNotFoundException 类路径资源
  • 修改清单文件 Win32 Visual Studio 2022

    如何在 Visual Studio 2022 中 修改 生成 Win32 应用程序的程序集清单文件 项目属性 gt Win32 资源 gt 清单路径设置为 gt 使用默认设置嵌入清单 我可以将其设置为使用自定义清单 但我想要做的是获取具有默
  • 如何在 DIV 元素上合成浏览器单击事件?

    通过按钮 我可以调用click 方法来生成点击 然而 DIV 并非在所有浏览器上都具有此方法 但我可以将点击事件侦听器附加到它们 通过设置 onclick 或添加事件监听器 有什么方法可以让我以编程方式 合成 对此类元素的点击 但是不使用
  • 如何将字符串转换为浮点数组?

    您将如何转换字符串 比方说 string Numbers 0 3 5 7 9 8 6 2 0 54 6 3 转换为浮点数组 例如 float Numbers 6 0 3 5 7 9 8 6 2 0 54 6 3 我会使用来自的数据结构和算法
  • c# OCR无法识别数字(tesseract 2)

    I m trying to extract digits from the following 它失败了 我得到了 作为回报 我正在使用 google 的 tesseract 2 使用 C 开源 c 包装器 现在我想知道 这个图像是否太糟糕
  • 如何检查for循环内的唯一性?

    有没有办法检查切片 映射是否存在值 我想为切片添加一个值only如果是的话not存在于切片中 这可行 但看起来很冗长 有一个更好的方法吗 orgSlice int 1 2 3 newSlice int newInt 2 newSlice a
  • Webpack babel es6 给我错误,react-router 1.0“找不到模块”?

    我在使用react router时遇到以下错误 它所引用的错误看起来像是在我的应用程序代码之外 但在react router库本身中 ERROR in react router lib Router js Module not found
  • 在Android中查找包含View的Window

    我找不到获得参考的方法Window包含任意Viewv 我发现获取窗口令牌 http developer android com reference android view View html getWindowToken 但我不知道如何使
  • Android BottomNavigationView 与闪屏返回堆栈问题

    所以我设置了我的BottomNavigationView like here https youtu be Covu3fPA1nQ 使用导航组件库 一切正常 每个选项卡都可以保留其后堆栈 但是 如果我添加一个启动屏幕 Fragment an