Fragment

fragment重叠问题

出现场景
① 横竖屏切换
②在我切换他其他的app,操作一会之后,再回到当前的app,有很大几率会出现fragment重叠的现象。
原因分析:

      通过搜集相关资料,我找到了原因,在我切换到其他app的时候,fragment所在activity已经被销毁。并且通过

@Override  
public void onSaveInstanceState(Bundle outState) {  
    // TODO Auto-generated method stub        
    Log.v("LH", "onSaveInstanceState"+outState);  
    super.onSaveInstanceState(outState);  
}
这个方法保存了相关的数据。

         当我再次回到这个app的时候,通过onCreate中的参数savedInstanceState恢复了之前的fragment。此时的FragmentTransaction中的相当于又再次add了fragment进去的,之前保存的fragment也还在。hide()和show()方法对之前保存的fragment已经失效了。所以出现了重叠的现象。
         解决方法如下,在进入onCreate函数时,先去判断savedInstanceState是否为null,如果不为null,则表示里面有保存这四个fragment。则不再重新去add这四个fragment,而是通过Tag从前保存的数据中直接去读取。相关代码如下:

//FragmentManager fManager;  
@Override  
public void onCreate(Bundle savedInstanceState) {  
    fManager = getFragmentManager();  
    if (savedInstanceState != null) {  
        allFrg = (AllOfficialAccountFragment) fManager.findFragmentByTag("allFrg");  
        movieFrg = (MovieOfficialAccountFragment) fManager.findFragmentByTag("movieFrg");  
        newsFrg = (NewsOfficialAccountFragment) fManager.findFragmentByTag("newsFrg");  
        otherFrg = (OtherOfficialAccountFragment) fManager.findFragmentByTag("otherFrg");           
    }  
    super.onCreate(savedInstanceState);       
}
 这样子仍是对之前保存的fragment操作,成功解决了重叠的问题。          



///////////////////////////////////////////deadline//////////////////////////////////////////////////////////////

通过上面的方法,在我的应用中,貌似也没有能够很好的解决问题。

另外一个思路是,直接在包含Fragment的Activity中复写

public void onSaveInstanceState(Bundle outState) {  
    // TODO Auto-generated method stub       
    //Log.v("LH", "onSaveInstanceState"+outState);  
    //super.onSaveInstanceState(outState);   //将这一行注释掉,阻止activity保存fragment的状态
}

**】附:①getFragmentManager得到管理这个
fragment的Manager;
②getChildFragmentManager()得到这个fragment****

】附2: fragment在hide()的时候,不会调用周期方法
在replace的时候,会调用相应的周期函数

内部嵌套的fragment的manager
1、Fragment,碎片,3.0之后推出,最小的sdk为11
是Acitvity的一部分,必须结合使用
一个Activity可以有多个Fragment
一个Fragment可以被多个Activity使用

2、Fragment的使用
创建子类,继承Fragment,重写生命周期方法(onCreateView),向Fragment中添加UI控件

3、Activity引用Fragment
a:静态方式:布局文件中引入
在Activity的布局文件中,使用fragment标签,使用class和android:name属性引入fragment,值为全类
】如果让添加tag或者id属性,clean一下Ok

b:动态方法:使用代码引入
b.1:在Activity布局文件中,使用LinearLayout或FrameLayout等布局给Fragment占位置
b.2: 先创建FragmentManager:getFragmentManager()
再开启事务:manager.beginTransaction()
操作Fragment:add,remove,replace
提交事务,transaction.commit()

4、传值
a:Arguments
在Fragment对象现实之前,使用setArgument从Activity给Fragment传值,只适用于动态的添加Fragment

传值方向:Activity–》Fragment

实现步骤:
在Activity中使用Fragment的对象调用setArguments动态的给Fragment传值
在Fragment中使用getArguments方法获得值

b:application
代表android的一个应用程序,此类是单例的,表示当前的应用程序对象

实现步骤:
1)、创建Application的子类,使用子类对象封装数据
2)、修改清单文件中的Application标签,改成自定义子类
android:name=”全类名”
3)、可以在应用程序 的任何位置获得Application子类的对象
4)、可以使用该对象设置或获得值

1 Fragment生命周期与Activity生命周期比较

Activity的onCreate()—onAttach()—onCreate()—onCreateView()—onActivityCreated()—Activity的onStart()—onStart()—Activity的onResume()—onResume()—onPause—-Activity的onPause()—onStop()—–Activity的onStop()onDestrouView()—onDestroy—onDetach()—Activity的onDestroy()

2 传值四种方式
】通过setArguments(),getArguments();
】通过Application
】接口回调
】利用构造方法传值

【附一】切换多个fragment时,可以通过隐藏、显示fragment的方式,保证fragment不重复加载数据

原理:切换时,隐藏当前fragment,显示要切换的fragment。
没有直接的方法获取当前显示的fragment,可以通过一个Fagment变量 f 记录当前fragment (一旦切换,就更改 f )

**实例**
private Fragment currentFragment;
/******************* 点击事件的监听 ********************************/
    @Override
    public void onClick(View v) {

            switch (v.getId()) {

            case R.id.web_tvAll://杂谈

                if(allFragment.isAdded()){
                    if(!allFragment.isVisible()){
                        tvAll.setTextColor(getResources().getColor(R.color.color_red));
                        tvMovie.setTextColor(getResources().getColor(R.color.color_bai));
                        fmManager.beginTransaction().hide(currentFragment).commit();
                        currentFragment=allFragment;
                        fmManager.beginTransaction().show(allFragment).commit();

                    }


                }else{
                    tvAll.setTextColor(getResources().getColor(R.color.color_red));
                    tvMovie.setTextColor(getResources().getColor(R.color.color_bai));
                    fmManager.beginTransaction().hide(currentFragment).commit();
                    currentFragment=allFragment;
                    fmManager.beginTransaction().add(R.id.web_layout, allFragment).commit();
                }
                break;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值