学习Android已经四个月了,一直都没有写总结或者新的的习惯,有时候学习到了一些新鲜的知识也没有及时的记录下来,为了改变自己,今天就从刚学的片段管理知识讲起吧。有说错什么的,有大神看到也请指出,毕竟还是只小菜鸡。

首先从Fragment的生命周期说起,Fragment依赖于Activity,只有在Activity执行onCreate创建之后Fragment才执行onAttach、onCreate、onCreatView、onActivityCreated等方法,这些知识网上可以快速的找到,分享链接http://www.cnblogs.com/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: The specified child already has a parent. You must call removeView() on the child's parent first.

这个异常告诉我们,子视图已经被关联在一个父容器里面了,我们要先对父容器调用removeView()移除掉这个view才行才行,怎么做呢?很简单,我们只需要在onDestoryView()中添加上一句代码:

@Override

public void onDestroyView() {

super.onDestroyView();

((ViewGroup)view.getParent()).removeView(view);

}

这样我们就不需要对已有的view和成员变量重新赋值,达到了一个小小优化的目的。

在这里我引用了网友分享的知识,上链接:http://www.cnblogs.com/jack-1900/p/3874228.html

紧接着另外一个问题就是Fragment切换的问题,我在开发项目过程中感觉到Fragment切换有时会伴随着卡顿现象,在网上查找资料后,按照各路大神的指点和经验,首先判断是Fragment在onCreatView初始化中做了比较长的耗时操作,于是我按照上面的优化方法,先优化了查找控件等一些初始化事件,并在Fragment的onCreatView执行开始时到onResume结束记录了总执行耗时,得到的都是100ms以上的结果,因此我想可能是片段切换的方式存在问题。

我使用的Fragment切换的方法参照的是ApiDemo的FragmentStackFragmentSupport等,Demo里面使用到的切换方法有add(),repalce(),使用回退栈来保存上一个片段状态或者返回栈中的片段状态(不知道这样描诉有没有错,或者有没有说清楚。。。具体代码大家可以看ApiDemo),例如:

Fragment newFragment = FragmentStackSupport.CountingFragment.newInstance(mStackLevel);

FragmentTransaction ft = getChildFragmentManager().beginTransaction();

ft.add(R.id.simple_fragment, newFragment).commit();----添加片段

FragmentManager fm = getChildFragmentManager();

if (fm.getBackStackEntryCount() > 0) {

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

FragmentManager.POP_BACK_STACK_INCLUSIVE);------回退到栈中某个状态

}

Fragment newFragment = FragmentStackSupport.CountingFragment.newInstance(mStackLevel);

FragmentTransaction ft = getChildFragmentManager().beginTransaction();

ft.replace(R.id.simple_fragment, newFragment);------切换片段

ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

ft.addToBackStack(null);------往栈中添加状态

ft.commit();

按照Demo的这些方法我们可以对片段进行管理,但是切换片段我们只使用add()方法网上层添加片段的话,会出现重影的问题,使用replace()替换的话就会出现现在我想要说的片段卡顿问题,不知道是不是replace()这个方法一定会出现大约100多ms的耗时操作(还不能确定大家都是不是这样)。

以上的推论只是我个人的见解,具体原因因为源代码看不到,我也不是很肯定,不过参考了网上的大神,还是让我找到了一个替代replace()的片段切换方式,那就是hide()和show();当我们使用到的片段常用不需要销毁时,我们可以使用这个方法来做,上代码:

FragmentTransaction bt = fm.beginTransaction();

if(homeFragment.isAdded()){

bt.show(homeFragment);-----如果该片段已经被添加,则显示即可;

}else{

bt.add(R.id.frame_layout, homeFragment);------如果该片段未被添加,则添加

}

bt.commit();

FragmentTransaction bt = fm.beginTransaction();-----在已经add的homeFragment上添加Fragment

bt.hide(homeFragment);---------先隐藏当前Fragment

if(myFragment.isAdded()){

bt.show(myFragment);

}else{

bt.add(R.id.frame_layout, myFragment);--------按照同样的方法显示一个片段

}

bt.commit();

通过isAdded()、show(Fragment)、add(layoutId,Fragment)这三个方法就可以取代replace()这个方法啦,耗时的操作也可以避免了。

这是引用网友知识的原址:http://www.yrom.net/blog/2013/03/10/fragment-switch-not-restart/#

大家要是看不明白我的可以去看原作写的。

就先记录到这了,这些片段替换的操作都是我们手动可控制的,如果是tabhost的话那就不太清楚了,下一个需要去研究的问题就是tabhost切换Fragment时,片段的生命周期问题。到时候再看看研究的如何。睡觉去。。。。

转载于:https://blog.51cto.com/linwg/1571895

Android   Fragmnet的使用新体会相关推荐

  1. Android新体会(二)仿桌面实现图标拖动

    这篇博客主要讲解如何代码实现拖动图标功能.阅读本篇博客之前请先阅读上一篇博客,了解一下事件分发机制的一些要点. Android新体会(一)通过仿桌面实现图标拖动了解事件分发机制 然后是demo地址ht ...

  2. 调用实现天气预报功能android,Android编程实现获取新浪天气预报数据的方法

    本文实例讲述了Android编程实现获取新浪天气预报数据的方法.分享给大家供大家参考,具体如下: 新浪天气预报地址: http://php.weather.sina.com.cn/xml.php?ci ...

  3. Android中文输入的新选择——搜狗拼音输入法

    如果不是我的Google拼音输入法出了点问题,我大概不会去尝试搜狗的Android平台拼音输入法.虽然全键盘在竖屏的情况下非常难用,不过横屏的时候还是可以接受的,何况G1有物理键盘. 现在的问题是,我 ...

  4. android系统源代码添加新产品的支持

    不同项目共用一个CPU等核心平台,项目外围有些差异,需要共用绝大部分代码,比如我们基于高通msm8937 64位CPU开发3款产品(每款产品定义为一个项目的体现形式),我们用DEVELOP_PROJE ...

  5. Android Pie 引入 Keystore 新特性,安全防护再升级

    作者: Lilian Young 和 Shawn Willden, Android 安全团队:Frank Salim, Google Pay 团队 我们希望更深入的了解您的开发实践与体验,以便为您构建 ...

  6. android源码中的ndk,如何在不需要Android操作系统源代码的情况下在Android NDK中创建新的NativeWindow?...

    我想编译一个Android OpenGL控制台应用程序,您可以直接从控制台启动Android x86或从Android x86 GUI中的Android终端应用程序运行.如何在不需要Android操作 ...

  7. 在Android平台上发现新的恶意程序伪装成杀毒软件挟持设备

    Android平台恶意程序:不支付$100隐私就泄漏]6月25日消息,安全公司赛门铁克发布报告,在Android平台上发现新的恶意程序伪装成杀毒软件挟持设备,消费者支付$100才能让设备正常运作.这些 ...

  8. iphone8 android传文件,如何从iPhone或Android将数据传输到新的iPhone 8

    第1部分:如何将数据传输到新的iPhone 8? Wondershare MobileTrans提供了一种快速可靠的方式将数据从一个设备移动到另一个设备.它具有直接的电话到电话传输功能,支持所有主要数 ...

  9. android各个版本的新特性

    首先看看最新版本Android 11 : https://www.zhihu.com/question/420186152 4.0 Ice Cream Sandwich(冰激凌三明治):2011年10 ...

最新文章

  1. python语法基础及if、while、for等语句介绍
  2. java线程 教程_Java多线程系列教程
  3. Jupyter notebook 多行注释 输出注释的文本
  4. VTK:可视化之NormalsDemo
  5. jsp mysql servlet_JSP+Servlet+JDBC+mysql实现的学生成绩管理系统
  6. 广告拦截之easylist和easylistchina订阅地址
  7. mysql技术blog_Mysql技术 - 包子博客 _ 关注互联网前端、开发、SEO、移动互联网应用技术...
  8. seaborn—seaborn.boxplot绘制箱型图
  9. 应用程序平台应用之星:在线手机应用开发平台 不用搭建环境
  10. java referencemap_Java中关于WeakReference和WeakHashMap的理解
  11. Apache自带的ab压力测试工具用法详解
  12. STM32CUDE-STM32F407学习笔记2-按键操作
  13. 深度学习—神经网络和卷积神经网络简单介绍
  14. 移动硬盘格式化后还能恢复数据吗 格式化的移动硬盘数据能恢复吗
  15. SpringBoot——自学笔记
  16. 安装PHP7.4找不到包error: Package requirements (oniguruma) were not met错误
  17. 只有真正将产业互联网看成是一种嬗变的过程,才能把握其精髓和原始奥义
  18. 计算机二级安装64位的还是,判断电脑适合装64位还是32位系统需要cpu支持,很多人都搞错了!...
  19. 了解 Fetch API
  20. proftpd的SSH_DISCONNECT (Read TImed out,Key exchange failed.错误解决

热门文章

  1. SQL Server 2005中的分析服务功能[转]
  2. linux+xampp搭建WordPress个人网站过程详解
  3. WritePrivateProfileString、GetPrivateProfileString 读写配置文件
  4. 你人生中的那口井挖了没有?
  5. ch5 MySQL 备份与恢复
  6. 计算Android屏幕解锁组合数
  7. Error: No module named books
  8. SQL字符串基本操作汇总
  9. BCH期货要来了?这家公司想让BCH成为第二大加密货币
  10. 24. Swap Nodes in Pairs