Android Fragment使用问题集结

版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/woshimalingyi/article/details/53056803

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));
        }
    }

猜你喜欢

转载自blog.csdn.net/woshimalingyi/article/details/53056803