我想在我的应用导航逻辑中实现,例如在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的应用导航逻辑
发布评论