定义

Fragment可以理解成一个迷你型的活动,同样可以包含布局,同样有自己的生命周期。比Activity要轻量级,在程序内部做界面跳转要比Activity快的多。

静态添加

Fragment可以静态或者动态的添加到Activity中,其中静态情况下,直接在layout.xml中添加fragment节点,并指定android:name属性就可以启动相应的fragment.

动态添加

可以在Activity中通过覆盖onCreate()函数来动态添加Fragment

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null){
getSupportFragmentManager().beginTransaction().add(R.id.container, new MainFragment()).commit();
}
}

动态替换:

在Fragment中可以通过添加按钮事件接收器覆盖当前的fragment:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.fragment_main, container, false); rootView.findViewById(R.id.btnShowAnotherFragment).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
getFragmentManager().beginTransaction()
.addToBackStack(null)
.replace(R.id.container, new AnotherFragment())
.commit();
}
});

注意,一个静态添加的Fragment,通过这种动态的方法进行替换会造成两个Fragment在Framelayout中的重叠。

生命周期:

当一个B Fragment被另一个A fragment启动的时候会执行B oncreate, A onPause, A onDestroyView,B oncreateview

这个A Fragment并不会执行A onDestroy。

当按Back键返回时会执行B onPause, B onDestroyView, B onDestroy销毁, A onCreateView。

碎片与活动的通信

关于这个问题有一片文章总结的比较好:Android:Activity与Fragment通信(99%)完美解决方案

要想在活动中得到碎片的实例,需要调用FragmentManager的findFragmentById()函数,反过来如果想在碎片中得到活动的实例需要调用getActivity()函数。

如果fragment需要调用activity的函数,则需要保存activity的实例,并定义一个接口,让activity去实现,这样就可以通过fragment保存的实例去调用了。这样做的主要问题是耦合太多,如果activity改变,比如被删除了,那么fragment的代码也需要被更改。

解决方法

定义一个baseFragment类,在其中保存 一个baseActivity类的实例。baseActivity的功能是有一个回调函数可以在baseFragment被onAttach的时候调用,这个函数会将所有的会被fragment调用的函数添加到一个HashMap中,只要在Activity中实现了这个接口,就可以保证在onAttach的时候被添加进来。添加机制定义好之后,只要在我们要定义的activity中实现这个接口,那么就一定会被包含在我们的HashMap中,以供调用。 一个Functions实例。Functions实例就是我们保存HashMap的地方。 当调用的时候,会直接取得这个实例并进行调用。 至此,Activity通过固定的接口进行添加接口函数以供fragment调用,当添加删除Activity的时候Fragment完全不需要改动,当这个fragment被attach到哪一个activity的时候它所能进行的调用就都由Activty侧定义了,fragment要做的就是发起调用,说白了就是以 固定的方式进行activity和fragment之间的函数调用,没啥意思。

其他

当一个Activity执行onPause()的时候,这个Activity中所有的Fragment都会执行onPause() 当一个Fragment被作为layout的Item添加进来的时候,是不可以被删除的 所有的Fragment之间的通信都是靠Activity,两个Fragment之间不能直接通信。

Android Fragment的使用的更多相关文章

  1. 【Android自学日记】【转】Android Fragment 真正的完全解析(下)

    上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和各种API,如果你还不了解,请看:Android Fragment 真正的完全解析(上). 本篇将介绍上篇博客提到的:如何管理Frag ...

  2. Android Fragment使用(四) Toolbar使用及Fragment中的Toolbar处理

    Toolbar作为ActionBar使用介绍 本文介绍了在Android中将Toolbar作为ActionBar使用的方法. 并且介绍了在Fragment和嵌套Fragment中使用Toolbar作为 ...

  3. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  4. Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误

    嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...

  5. Android Fragment使用(一) 基础篇 温故知新

    Fragment使用的基本知识点总结, 包括Fragment的添加, 参数传递和通信, 生命周期和各种操作. Fragment使用基础 Fragment添加 方法一: 布局里的标签 标识符: tag, ...

  6. Android Fragment应用实战

    现在Fragment的应用真的是越来越广泛了,之前Android在3.0版本加入Fragment的时候,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题,但现在即使只是在手机上, ...

  7. Android Fragment 真正的完全解析(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37992017 上篇博客中已经介绍了Fragment产生原因,以及一些基本的用法和 ...

  8. Android Fragment

    1.Fragment必须是依存与Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期. 2.Fragment 生命周期: 首页 最新文章 在线课程 业界 开发 ...

  9. Android Fragment应用实战,使用碎片向ActivityGroup说再见

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/13171191 现在Fragment的应用真的是越来越广泛了,之前Android在3 ...

  10. Android Fragment完全解析

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8881711 我们都知道,Android上的界面展示都是通过Activity实现的, ...

随机推荐

  1. PHP: 深入pack/unpack

    https://my.oschina.net/goal/blog/195749 PHP作为一门为web而生的服务器端开发语言,被越来越多的公司所采用.其中不乏大公司,如腾迅.盛大.淘米.新浪等.在对性 ...

  2. Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0

    maven构建项目的时候遇到这个错误: 一.直接原因 制定路径下确实没有sqljdbc4.jar文件. 二.根本原因 微软不允许以maven的方式直接下载该文件. 三.解决办法 3.1 手动下载相关库 ...

  3. 【Android】实现打开关闭效果

    最近抽时间学习一下Android,做个笔记: 布局xml: <LinearLayout android:id="@+id/date_label" android:layout ...

  4. 安装和配置SVN服务器Subversion、客户端TortoiseSVN和Visual Studio插件AnkhSvn

    1.下载并安装服务器端Subversion下载地址:http://subversion.apache.org当前最新版本为1.8.10,默认安装目录为C:\Program Files\Subversi ...

  5. Web墨卡托投影(转)

    Google Maps地图投影全解析(1):Web墨卡托投影 Google Maps.Virtual Earth等网络地理所使用的地图投影,常被称作Web Mercator或Spherical Mer ...

  6. jsonp的使用

    假设我们已经了解什么是同源策略,以及什么是浏览器的同源策略的限制. 现在我们需要在a.demo.com下的某个页面one.html 里加载不同域b.demo.com下的json数据. 我们都知道用&l ...

  7. Predicate接口和Consumer接口

    Predicate和Consumer接口是集合操作中常用到的俩个接口: 1.Predicate public interface Predicate<T>{ boolean test(T ...

  8. 程序设计入门——C语言 第7周编程练习 1多项式加法(5分)

    第7周编程练习 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...

  9. 【java基础】 合并两个类型相同的list

    将两个类型相同的list合并,可以用 addAll(Collection<? extends E> c) import java.util.ArrayList; import java.u ...

  10. EasyUI的combobox控件使用onchange 问题

    在项目中几次都遇到了同样的问题,现在都不知道怎样解决了! 路过的朋友们帮我看看嘛!谢谢了! 最后我想要实现的效果是这样的.   在下拉列表中不存在值.(这里的是下拉列表中存在值的!)  但是在我输入值 ...