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

编程入门 行业动态 更新时间:2024-10-24 02:27:23
本文介绍了如何复制YouTube的应用导航逻辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我想在我的应用导航逻辑中实现,例如在Youtube应用中. (BottomNavigationView +片段管理).我想要这个,因为这些片段很重,所以我希望将它们进行延迟初始化,然后再存储在backstack中,我觉得YouTube就是这样做的.我已经实现了BottomNagivationView,但是片段管理存在问题.

I want to implement in my app navigation logic like in Youtube app. (BottomNavigationView + Fragment management). I want this, because these fragments are heavy, so I want them to be lazy initialized and then stored in backstack, I feel like YouTube is doing it this way. I have implemented BottomNagivationView but I have problems with Fragment Management.

我的代码:

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函数

and here is my setFragment function

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应用中的工作方式有任何想法吗?

And it's working, but not as good as YouTube app. YouTube app has some magic behaviour i.e. it keeps only one transaction per each fragment, while my app allows to create "infinite" backstack of transactions. Do you have any ideas how it works in YouTube app ?

推荐答案

san的答案显示了预期的片段,但是每次更改片段时,都有一些bug两次在HomeFragment上调用onCreateView.另外,每次更改页面时,更改页面都会实例化新片段. 因此,我使用了代码,并修改了我的setPage,它的运行效果很好.

Since san's answer was showing fragments as expected, but has some bugs that call onCreateView on HomeFragment twice each time the fragment is changed. Additionally changing page is instantiating new fragment each time the page is changed. So I took the code and modified my setPage and it's working great.

方法如下:

private void setPage(Page page) { FragmentManager fragmentManager = getSupportFragmentManager(); String tag = page.name(); FragmentTransaction transaction = fragmentManager.beginTransaction(); // detach everything for (Fragment fragment : fragmentManager.getFragments()) { transaction.detach(fragment); } // Retrieve fragment instance, if it was already created Fragment fragment = fragmentManager.findFragmentByTag(tag); if (fragment == null) { // If not, crate new instance and add it try { fragment = (Fragment) page.clazz.newInstance(); transaction.add(R.id.frame, fragment, tag); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } } else { // otherwise just attach it transaction.attach(fragment); } transactionmit(); }

onBackPressed实现

onBackPressed implementation

@Override public void onBackPressed() { if (!getSupportFragmentManager().findFragmentByTag(Page.HOME.name()).isDetached()) { super.onBackPressed(); } else { navigation.setSelectedItemId(R.id.navigation_home); } }

更多推荐

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

本文发布于:2023-10-27 18:55:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1534251.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:逻辑   YouTube

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!