Android - 新的 BottomNavigationBar 中的 PageView - 防止重新加载片段

Posted

技术标签:

【中文标题】Android - 新的 BottomNavigationBar 中的 PageView - 防止重新加载片段【英文标题】:Android - PageView in new BottomNavigationBar - prevent reload fragments 【发布时间】:2017-11-06 15:18:38 【问题描述】:

在我的 StartActivity 中,BottomNavigationBar 侦听器具有以下设置:

private GuideFragment guideFragment = new GuideFragment();
private MapFragment mapFragment = new MapFragment();
private MoreFragment moreFragment = new MoreFragment();

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

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) 
        Fragment selectedFragment = null;
        switch (item.getItemId()) 
            case R.id.navigation_guide:
                selectedFragment = guideFragment;
                break;
            case R.id.navigation_map:
                selectedFragment = mapFragment;
                break;
            case R.id.navigation_more:
                selectedFragment = moreFragment;
                break;
        
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.content, selectedFragment);
        transaction.commit();
        return true;
    

;

正如我上面提到的,我想防止所选片段总是重新加载源/视图。 我在片段中尝试了一些类似 - 的东西:

if (rootView == null)
     inflater.inflate...

但片段仍然重新创建视图并加载(在我的情况下)新的 webresources。

我读到了一些 PageView 可以提供帮助的东西,尤其是

offScreenPageLimit

应该施展魔法。

我的主要问题是我应该在哪里实现 PageViewer - 是否可以在我的 StartActivity 中实现? 或者我可以通过其他方式解决问题吗?

【问题讨论】:

您的片段内容是直接相关还是相切相关?也就是说,每个片段的内容是否可以在没有其他片段的情况下存在并且有意义?如果没有,那么使用ViewPager 切换选项卡式导航可能更符合您的要求。 所有三个片段都在不同的视图/选项卡中。 View Pager 是一个自己的类还是我可以将它添加到我的活动中? 或者我理解正确 - 我是否必须删除 BottomNavigation 并用 ViewPager 替换它? 是的 - 考虑您正在展示的内容的类型,然后选择最适合展示该内容的小部件。查看material.io/guidelines/components/bottom-navigation.html,然后查看 ViewPager 文档。 ViewPager 可能会更好地满足您的要求。 好的,谢谢 CzarMatt。但我不敢相信 android/Google 团队提供了一个不处理片段生命周期的 BottomNavigationBar。当然这有点新东西 - 但总是称标签的新实例是...... 【参考方案1】:

我做到了,孩子们! 不需要ViewPager

这是我的解决方案(全部在StartActivity 中而不是在Fragments 中编码):

private final GuideFragment guideFragment = new GuideFragment();
private final MapFragment mapFragment = new MapFragment();
private final MoreFragment moreFragment = new MoreFragment();
private final android.app.FragmentManager fm = getFragmentManager();
Fragment active = guideFragment;

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

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) 
        switch (item.getItemId()) 
            case R.id.navigation_guide:
                if(active != guideFragment) 
                    fm.beginTransaction().show(guideFragment).commit();
                
                else 
                    fm.beginTransaction().hide(active).show(guideFragment).commit();
                
                active = guideFragment;
                break;
            case R.id.navigation_map:
                fm.beginTransaction().hide(active).show(mapFragment).commit();
                active = mapFragment;
                break;
            case R.id.navigation_more:
                fm.beginTransaction().hide(active).show(moreFragment).commit();
                active = moreFragment;
                break;
        

        return true;
    

;

并在 onCreate 列表中提交事务。

fm.beginTransaction().add(R.id.content,moreFragment).commit();
fm.beginTransaction().add(R.id.content, mapFragment).commit();
fm.beginTransaction().add(R.id.content, guideFragment).commit();

如果您有 3 个选项卡,最后提交第一个选项卡片段 (fragm3,fragm2,fragm1) 非常重要。

现在通过不加载新/刷新的每个片段来在智能手机上实现高速性能。

【讨论】:

以上是关于Android - 新的 BottomNavigationBar 中的 PageView - 防止重新加载片段的主要内容,如果未能解决你的问题,请参考以下文章

可以使用现有布局创建新的 Android 活动吗?

向 Android 添加新的网络承载

Android4.0 添加一个新的Android 键值

Android 6.0 系统棉花糖新的特性和功能

怎么为Android系统添加一个新的资源包

Android新的底部导航栏或BottomNavigationView