Android Fragment嵌套使用问题总结

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值