2017-08-07 49 views
0

我想在我的应用导航逻辑中实现,如在Youtube应用中。 (BottomNavigationView +片段管理)。我想要这个,因为这些片段很重,所以我希望它们被初始化,然后存储在后台,我觉得YouTube是这样做的。我实施了BottomNagivationView,但我遇到了片段管理问题。如何复制YouTube的应用导航逻辑

我的代码:

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应用程序中工作?

回答

0

我想这里最好的方法是使用ViewPager来存储根片段。导航栏将更改ViewPager的页面。

根片段将在其ChildFragmentManagers内存储内容片段并实现内容片段之间导航的逻辑。

此外,您还需要实现从活动到根片段的委托后台事件的逻辑,以便在他们的后台执行导航。

UPD#1
确认,这根片段内部没有ViewPager破坏,使用setOffscreenPageLimit()

UPD#2 如果你不想使用ViewPager,您可以使用从码这个answer来管理根片段。

+0

ViewPager是我目前的实现,我想改变它,因为一次加载3个片段太重了。 –

+0

@StachuBarański如果它太重,以至于在第一次加载时第一次加载3个片段时只有第一次加载,而其他加载数据(如果用户滑动以查看它们)。 – hardartcore