如何复制YouTube的应用导航逻辑 [英] How to copy YouTube's app navigation logic

查看:126
本文介绍了如何复制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 ?

推荐答案

代码,并修改了我的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);
    }
    transaction.commit();
}

onBackPressed实现

onBackPressed implementation

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

这篇关于如何复制YouTube的应用导航逻辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆