出现场景 ① 横竖屏切换 ②在我切换他其他的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的状态 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 **】附:①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; ———————————————— |
|