如何复制 YouTube 的应用导航逻辑

2024-01-07

我想在我的应用程序中实现导航逻辑,就像在 Youtube 应用程序中一样。 (BottomNavigationView + Fragment 管理)。我想要这个,因为这些片段很重,所以我希望它们被延迟初始化然后存储在backstack中,我觉得YouTube就是这样做的。我已经实现了 BottomNagivationView,但我在片段管理方面遇到了问题。

My code:

bottomNavigationView.setOnTabSelectedListener { position, _ -> 
    setFragment(OnlinePageFragment.Page.values()[position])
}

其中 Pages 是枚举

enum class Page(index: Int, val klass: Class<*>) {
        ONE(0, OnePageFragment::class.java),
        TWO(1, TwoPageFragment::class.java),
        THREE(2, ThreePageFragment::class.java)
    }

这是我的 setFragment 函数

fun setFragment(page: OnlinePageFragment.Page) {
    var fragment: Fragment? = supportFragmentManager.findFragmentByTag(page.klass.name)
    val tag = page.klass.name

    if (fragment == null)
        fragment = OnlinePageFragment.newInstance(page, null)

    val ft = supportFragmentManager.beginTransaction()
    with(ft) {
        replace(R.id.fragmentContainer, fragment, tag)
        addToBackStack(tag)
        commit()
    }

}

override fun onBackPressed() {
    if (supportFragmentManager.backStackEntryCount == 1) finish()
    else super.onBackPressed()
}

它可以工作,但不如 YouTube 应用程序。 YouTube 应用程序有一些神奇的行为,即每个片段只保留一个事务,而我的应用程序允许创建“无限”的事务回栈。您对 YouTube 应用程序的运作方式有什么想法吗?


无需使用查看寻呼机,您就可以管理它。 我已经实施了请检查这一点。https://github.com/sandeshsk/BackStackFragmentRedirectsToHome https://github.com/sandeshsk/BackStackFragmentRedirectsToHome

如有问题请更新。

这是一个分配片段的方法

public void addFragment(FragmentManager fragmentManager,
                               Fragment fragment,
                               int containerId,boolean isFromHome){

    fragmentManager.popBackStack(null,FragmentManager.POP_BACK_STACK_INCLUSIVE);

    FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();
    if(isFromHome){
        fragmentTransaction.replace(containerId,fragment);
    }else{
        fragmentTransaction.add(new HomeFragment(),"Home");
        fragmentTransaction.addToBackStack("Home");
    }
    fragmentTransaction.replace(containerId,fragment).commit();

}

这是您的导航项侦听器

 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.navigation_home:
               if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
                    addFragment(getSupportFragmentManager(), new HomeFragment(), R.id.frame, true);
                }else{
                    getSupportFragmentManager().popBackStack();
                }
                return true;
            case R.id.navigation_dashboard:
                addFragment(getSupportFragmentManager(),new DashboardFragment(),R.id.frame,false);
                return true;
            case R.id.navigation_notifications:
                addFragment(getSupportFragmentManager(),new NotificationFragment(),R.id.frame,false);
                return true;
            case R.id.navigation_setting:
                addFragment(getSupportFragmentManager(),new SettingFragment(),R.id.frame,false);
                return true;
        }
        return false;
    }
};

onBackPressed 方法

 @Override
public void onBackPressed() {
    if(getSupportFragmentManager().getBackStackEntryCount()>0){
        navigation.setSelectedItemId(R.id.navigation_home);
    }else {
        super.onBackPressed();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何复制 YouTube 的应用导航逻辑 的相关文章

随机推荐

  • 如何在 CakePHP 中生成 MySQL IS NOT NULL 条件?

    我正在尝试获取结果的子集作为 virtualField 以在我的视图中使用 我什至可能不知道如何解决这个问题 但这是我到目前为止所做的 我在这里从这个问题开始 CakePHP virtualField 查找所有不为空 https stack
  • Typescript,从接口中提取多个调用签名[重复]

    这个问题在这里已经有答案了 鉴于以下情况 interface Foo attr string a string number a number number 如何创建一种仅选择函数重载的类型 这意味着 interface Bar a str
  • 错误:请通过更新 google-services 插件的版本来修复版本冲突

    我在使用 Google 服务插件时遇到问题 我将谷歌服务更新到最新版本 我从这个网站获得了依赖 https bintray com android android tools com google gms google services h
  • Keras、Tensorflow:将两个不同的模型输出合并为一个

    我正在研究一种深度学习模型 我试图将两种不同模型的输出结合起来 整体结构是这样的 所以第一个模型采用一个矩阵 例如 10 x 30 input 1 input text layers Input shape 1 dtype string e
  • net.snowflake.client.jdbc.SnowflakeChunkDownloader :等待下载 #chunk0 超时

    等待下载块错误超时 Snowflake JDBC 驱动程序版本 3 13 18 遇到错误 net snowflake client jdbc SnowflakeSQLException JDBC driver internal error
  • iPython magic for Zipline 找不到数据包

    我有一个 Python 2 7 脚本 可以在命令提示符下正常运行 Zipline 使用 bundle myBundle加载自定义数据包myBundle我已经注册使用extension py zipline run f myAlgo py b
  • 如何使用 HttpWebRequest 发布数据?

    我有这个HttpWebRequest var request HttpWebRequest Create http example com api Phrase GetJDTO request ContentType application
  • 在GUI中删除表中的数据

    我有一个问题 当用户输入密钥时 如何删除 GUI 中 jTable 中的所有数据 谢谢 您可以设置一个新的空数据模型 TableModel newModel new DefaultTableModel jtable setModel new
  • Mahout 堆空间不足

    我正在使用 Mahout 在一组推文上运行 NaiveBayes 两个文件 一个 100 MB 一个 300 MB 我将 JAVA HEAP MAX 更改为 JAVA HEAP MAX Xmx2000m 之前是 1000 但即便如此 mah
  • 自动过滤 SQLAlchemy 查询的正确方法?

    我刚刚使用 sqlalchemy 从 CRM 应用程序中反思了一个相当令人讨厌的模式 所有表上都有一个已删除的列 我想自动过滤所有标记为已删除的实体和关系 这是我想出的 class CustomizableQuery Query An ov
  • 将阴影添加到视差遮挡贴图

    我已经通过实现视差遮挡贴图学习OpenGL https learnopengl com Advanced Lighting Parallax Mapping 现在我想添加自阴影 以便片段挤压在表面上投射阴影 我读过一些关于这个主题的论文 但
  • GitHub - 按作者列出提交

    有什么办法可以上GitHub http github com 在浏览器中列出单个作者所做的所有提交 都不是本地的 例如通过git log 也不通过 API 单击提交列表 提交历史记录 中的用户名只会进入该用户的个人资料页面 检查 GitHu
  • 使用 HashMap 作为表单支持 Bean Spring MVC + ThymeLeaf

    我是 Spring MVC 的新手 来自 Grails 是否可以使用 HashMap 作为表单支持 bean 在 Grails 中 人们可以从任何控制器操作访问名为 params 的对象 Params 只是一个映射 其中包含 POST 数据
  • 使用 VkSubpassDependency 与信号量?

    我正在关注这个 vulkan 教程 https vulkan tutorial com Drawing a triangle Drawing Rendering and presentation https vulkan tutorial
  • 如何从ubuntu中彻底删除cuda?

    我有ubuntu 18 04 并且意外安装了cuda 9 1来运行Tensorflow gpu 但似乎tensorflow gpu需要cuda 10 0 所以我想先通过执行删除cuda martin nlp server sudo apt
  • GIT:“被我们删除”的冲突有多危险?

    几天前 我在 master 的基础上创建了一个名为 new branch 的新分支 当我使用文件 file php 处理 new branch 时 他分支上的第二个开发人员删除了文件 file php 并将他的分支与 master 合并 现
  • Neo4j Python py2neo授权错误

    在 Windows 8 1 上安装 Neo4j 2 2 3 没什么特别的 通过 Neo4j 启动应用程序启动服务器 没什么特别的 开始使用 py2neo 如 Neo4j org 上的文档所示 遇到了我无法解释的授权错误 日志如下 特别说明
  • 使用 php/mysql 通过 IP 禁止

    我希望能够通过 IP 禁止用户 我的想法是在 BannedIPs 表中保留 IP 列表作为行 IP 列将是索引 为了根据表检查用户的 IP 我将为每个会话保留一个名为 SESSION IP 的会话变量 如果在任何请求中 SESSION IP
  • Python csv writer 是否始终使用 DOS 行尾字符?

    我意识到csvPython 中的库总是生成 DOS 行尾字符 即使我使用 wb 模式 即使我使用Linux import csv f open output txt wb writer csv writer f writer writero
  • 如何复制 YouTube 的应用导航逻辑

    我想在我的应用程序中实现导航逻辑 就像在 Youtube 应用程序中一样 BottomNavigationView Fragment 管理 我想要这个 因为这些片段很重 所以我希望它们被延迟初始化然后存储在backstack中 我觉得You