Android Fragment嵌套使用问题总结
2015-06-06 17:22
459 查看
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、实现[b]FragmentPagerAdapter[/b]
[b] 3、为ViewPager注册适配器[/b]
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);
}
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、实现[b]FragmentPagerAdapter[/b]
[b] 3、为ViewPager注册适配器[/b]
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);
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories