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使用懒加载提升性能