【移动应用开发技术】Android   Fragmnet的使用新体会_第1页
【移动应用开发技术】Android   Fragmnet的使用新体会_第2页
【移动应用开发技术】Android   Fragmnet的使用新体会_第3页
免费预览已结束,剩余1页可下载查看

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Android

Fragmnet的使用新体会

学习Android已经四个月了,一直都没有写总结或者新的的习惯,有时候学习到了一些新鲜的知识也没有及时的记录下来,为了改变自己,今天就从刚学的片段管理知识讲起吧。有说错什么的,有大神看到也请指出,毕竟还是只小菜鸡。首先从Fragment的生命周期说起,Fragment依赖于Activity,只有在Activity执行onCreate创建之后Fragment才执行onAttach、onCreate、onCreatView、onActivityCreated等方法,这些知识网上可以快速的找到,分享链接/purediy/p/3276545.html,这篇文章已经很好的阐述了Fragment和Activity的联系,这里我就不多说了。我想说的是Fragment的两个比较重要的方法:onCreatView()和onDestoryView(),前者负责创建一个view显示片段内容,后者从字面上理解看似是销毁了view,其实view却并没有被销毁,view的引用还在,成员变量也还在,这跟Activity的onDestory是有区别的,既然引用还在,那么在Fragment重新onCreatView的时候就不需要再重新创建一个新的view了,成员变量也不需要重新赋值,但是如果我们直接判断if(view!=null)就return

view的话,那么就会报下面这个异常:java.lang.IllegalStateException:Thespecifiedchildalreadyhasaparent.YoumustcallremoveView()onthechild'sparentfirst.这个异常告诉我们,子视图已经被关联在一个父容器里面了,我们要先对父容器调用removeView()移除掉这个view才行才行,怎么做呢?很简单,我们只需要在onDestoryView()中添加上一句代码:

@Override publicvoidonDestroyView(){ super.onDestroyView(); ((ViewGroup)view.getParent()).removeView(view); }这样我们就不需要对已有的view和成员变量重新赋值,达到了一个小小优化的目的。在这里我引用了网友分享的知识,上链接:/jack-1900/p/3874228.html紧接着另外一个问题就是Fragment切换的问题,我在开发项目过程中感觉到Fragment切换有时会伴随着卡顿现象,在网上查找资料后,按照各路大神的指点和经验,首先判断是Fragment在onCreatView初始化中做了比较长的耗时操作,于是我按照上面的优化方法,先优化了查找控件等一些初始化事件,并在Fragment的onCreatView执行开始时到onResume结束记录了总执行耗时,得到的都是100ms以上的结果,因此我想可能是片段切换的方式存在问题。我使用的Fragment切换的方法参照的是ApiDemo的FragmentStackFragmentSupport等,Demo里面使用到的切换方法有add(),repalce(),使用回退栈来保存上一个片段状态或者返回栈中的片段状态(不知道这样描诉有没有错,或者有没有说清楚。。。具体代码大家可以看ApiDemo),例如:FragmentnewFragment=FragmentStackSupport.CountingFragment.newInstance(mStackLevel);FragmentTransactionft=getChildFragmentManager().beginTransaction();ft.add(R.id.simple_fragment,newFragment).commit();添加片段FragmentManagerfm=getChildFragmentManager();if(fm.getBackStackEntryCount()>0){

fm.popBackStack(fm.getBackStackEntryAt(0).getId(),

FragmentManager.POP_BACK_STACK_INCLUSIVE);回退到栈中某个状态}FragmentnewFragment=FragmentStackSupport.CountingFragment.newInstance(mStackLevel);FragmentTransactionft=getChildFragmentManager().beginTransaction();ft.replace(R.id.simple_fragment,newFragment);切换片段ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);ft.addToBackStack(null);往栈中添加状态mit();按照Demo的这些方法我们可以对片段进行管理,但是切换片段我们只使用add()方法网上层添加片段的话,会出现重影的问题,使用replace()替换的话就会出现现在我想要说的片段卡顿问题,不知道是不是replace()这个方法一定会出现大约100多ms的耗时操作(还不能确定大家都是不是这样)。以上的推论只是我个人的见解,具体原因因为源代码看不到,我也不是很肯定,不过参考了网上的大神,还是让我找到了一个替代replace()的片段切换方式,那就是hide()和show();当我们使用到的片段常用不需要销毁时,我们可以使用这个方法来做,上代码:FragmentTransactionbt=fm.beginTransaction();if(homeFragment.isAdded()){ bt.show(homeFragment);如果该片段已经被添加,则显示即可;}else{ bt.add(R.id.frame_layout,homeFragment);如果该片段未被添加,则添加}mit();FragmentTransactionbt=fm.beginTransaction();在已经add的homeFragment上添加Fragmentbt.hide(homeFragment);先隐藏当前Fragmentif(myFragment.isAdded()){ bt.show(myFragment);}else{ bt.add(R.id.frame_layout,myFragment);按照同样的方法显示一个片段} mit();通过isAdded()、show(Fragment)、add(layoutId,Fragment)这三个方法就可以取代replace()这个方法啦,耗时的操作也可以避免了。这是引用网友知识的原址:/blog/2013/03/10/fr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论