Android Fragment使用问题集结

Posted David-Kuper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Fragment使用问题集结相关的知识,希望对你有一定的参考价值。


1、FragmentManager问题

问题描述:

  • 使用FragmentManager管理Fragment的时候,如果调用FragmentTransaction的replace方法(实际上是先调用add()然后再调用remove()),那么Fragment就会被销毁然后重新创建。
    这样导致几个问题:

    1、Fragment重新实例化,里面的状态无法保存。
    2、网络应用的情况下,Fragment重新实例化要重新请求数据,消耗多余流量。
    3、重新实例化需要消耗时间,用户体验下降

解决方法:

使用hide()、show()方法进行fragment的显示与隐藏。这种方案需要消耗内存空间作为代价换取时间和体验。

关键代码片段

public void switchFragment(Fragment from, Fragment to) 
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        if (!to.isAdded())     // 先判断是否被add过
            transaction.hide(from).add(R.id.fragment_container, to).commit(); // 隐藏当前的fragment,add下一个到Activity中
         else 
            transaction.hide(from).show(to).commit(); // 隐藏当前的fragment,显示下一个
        
    

2、Fragment里面嵌套Fragment

问题描述:

  • 很多手机应用都会有两层Fragment的嵌套,第一层是框架层的界面,一个Tab对应一个Fragment;第二层是某一个Tab下的Fragment里面又有多个Tab,每个Tab又对应一个Fragment,这个时候就要区分FragmentManager的获取方式了。如果使用不当,那么第二层下的Fragment就会出现数据错乱、不一致的问题。

getFragmentManager():该方法是获取管理第一层Tab的FragmentManager;是Activity界面下的Fragment管理。

getChildFragmentManager():该方法是获得Fragment下的第二层Tab的管理FragmentManager;是Fragment下的子Fragment管理。

解决方案:

Activity下的一级Tab,对应的使用getFragmentManager()来管理Fragment;
Fragment下的次级Tab,对应使用getChildFragmentManager()来管理子Fragment。


TabLayout+ViewPager+Fragment使用

问题描述

  • 自定义Tab:TabLayout与ViewPager关联的时候,默认会调用View中的PagerAdapter的getPageTitle()的方法来创建Tab,与ViewPager关联之后Tab是由框架创建,我们无法自定义创建。

解决方法

在setUpWithViewPager()调用之后,获取TabLayout中的每一个Tab,调用Tab的setCustomeView()方法用我们自定义的View替换掉原来的View即可。

关键代码

//必须先调用ViewPager.setAdapter
mViewPager.setAdapter(adapter);
mTabLayout.setupWithViewPager(mViewPager,false);

private void initTabView(String[] titles,KartinaFragmentPageAdapter adapter)
        for(int i = 0; i < titles.length; i++)
            TabLayout.Tab tab = mTabLayout.getTabAt(i);
            if (tab != null)
                tab.setCustomView(adapter.getTabView(i));
        
    

以上是关于Android Fragment使用问题集结的主要内容,如果未能解决你的问题,请参考以下文章

Android:何时/为啥我应该使用 FrameLayout 而不是 Fragment?

Android ViewPager Fragment使用懒加载提升性能

关于Android的fragment的使用

是否可以将 android.app.Fragment 与 FragmentStatePagerAdapter 一起使用

iOS 中的 Fragment (Android) 等价物

Android碎片:Fragment