1、Fragment类的使用
1)xml文件中使用Fragment:将Fragment当成一个控件来使用,灵活性很差,一般不推荐使用。
2)代码中动态添加Fragment,使用FragmentManager来管理Fragment;
3)最常用:viewpager+fragment,组合使用,实现欢动切换Fragment
2、动态添加Fragment
1)使用步骤
FragmentManager fManager=getSupportFragmentManager();//获取默认的Fragment管理器
FragmentTransaction fTransaction=fManager.beginTransaction();// 开启Fragment事务
myTaskFragment=new TaskFragment();
fTransaction.replace(R.id.fragment_content, myTaskFragment, "main");
fTransaction.commit();// 事务提交
2)replace()、add()、hide()、remove()方法的使用
replace()方法可以用来实现Fragment之间的切换,相当于add()和remove()的结合体。之前创建的Fragment将会被销毁,当你又切换回之前的Fragment时,将会重新创建Fragment;
add()向FragmentManager添加Fragment;
hide()隐藏Fragment;
推荐方法(切换Fragment):
为了避免replace()带来的销毁和重建Fragment的问题。可以使用add()+hide()+show的方式来实现切换Fragment
//创建第一个Fragment
FragmentManager fManager=getSupportFragmentManager();//获取默认的Fragment管理器
FragmentTransaction fTransaction=fManager.beginTransaction();// 开启Fragment事务
myTaskFragment=new TaskFragment();
fTransaction.replace(R.id.fragment_content, myTaskFragment, "main");
fTransaction.commit();// 事务提交
......................
//切换第二个Fragment
FragmentManager fManager=getSupportFragmentManager();//获取默认的Fragment管理器
FragmentTransaction fTransaction=fManager.beginTransaction();// 开启Fragment事务
fTransaction.hide(myTaskFragment);//隐藏第一个
fTransaction.add(R.id.fragment_content, mapFragment, "task");//
fTransaction.show(mapFragment);//显示第二个Fragment
3、viewpager+fragment,组合使用。相关类:FragmentPagerAdapter
1)viewpager是v4支持包重的类,FragmentPagerAdapter也是v4支持库重的类,是PagerAdapter的之类,专门用来适配Fragment。所以Fragment也只能使用v4支持库中的Fragment。区别于android.app.Fragment
2)使用方法
1、创建Fragment集合
2、实现FragmentPagerAdapter
3、为ViewPager注册适配器
4、Fragment嵌套使用
在一个Fragment中使用Viewpager,在viewpager中加入Fragment。需要注意两个问题:
1)在第一级Fragment中注册第二级Fragment(viewpager+fragment)时,使用getChildSupportFragmentManager
2)第一级Fragment的切换使用add/hide/show的组合方式,不要使用replace的方式来切换。原因:replace切换时,第一级Fragment和第二级Fragment都会被destory和detach,当重新切换回来时,需要重新创建第一级和第二级的Fragment,报错("Activity is Destoryed")。
猜想原因:replace切换时,虽然第一级Fragment和第二级Fragment都会被destory和detach,但是在缓存中依然(Debug跟踪发现的),但是却丢失了对activity的上下文。至今没找到解决方法,网上有一种解决方法,但是不顶用
try
{
//参数是固定写法,释放二级fragment的缓存
Field childFragmentManger=Fragment.class.getDeclaredField("mChildFragmentManager");//反射,跟踪到二级fragment的管理器
childFragmentManger.setAccessible(true);
childFragmentManger.set(this, null);
Log.d("field----", "mchildfragmentmanager");
}
catch (NoSuchFieldException e)
{
// TODO: handle exception
Log.d("field----", "mchildfragmentmanager1");
throw new RuntimeException(e);
} catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
Log.d("field----", "mchildfragmentmanager2");
throw new RuntimeException(e);
}