重新学习 Fragment

1.Fragment 的生命周期

想要熟练使用 Fragment,那么必须要弄懂它的生命周期。

我们可以先看一下 Fragment 生命周期和 Activity 生命周期的关联

该图展示了Fragment 和 Actvity 两者的生命周期的关系,我们可以看到 Fragment 比 Activity 多了一些生命周期的回调方法。

下面详细说明 Fragment 各个生命周期的作用:

1.onAttach(Context):

当 Fragment 和 Activity 发生关联时调用该方法。执行该方法时,Fragment 和 Activity 已经完成了绑定,该方法中的 Context 参数就代表已绑定的 Activty,你可以通过该方法获取到宿主 Activity 。

2.onCreate():

初始化 Fragment ,可通过参数 savedInstanceState 获取到保存的 Fragment 状态或者自己保存的数据。

3.onCreateView(LayoutInflater,ViewGroup,Bundle):

初始化 Fragment 的布局,一般在该方法中进行加载布局的操作,返回布局 view 到 OnViewCreated()方法中该方法中最好不要执行耗时操作,比如读取数据库数据等。

4.onViewCreated(View,Bnudle):

在 onCreateView()执行后调用,获得其返回的 view ,表示布局 view 已加载完成。一般可在该方法中进行 findViewById 的操作。

5.onActivityCreate(Bundle):

当关联的 Activity 的 onCreate 方法返回时调用,所以在该方法内可以进行与 Activity 交互的 UI 操作。(注意:在该方法之前由于 Activity 的onCreate 方法还未执行,如果提前进行交互操作,会引发空指针异常),一般可在该方法中加载数据。

6.onStart():

在 Fragment 可见时调用,类似 activity 的 onStart()方法。

7.onResume():

在 Fragment 处于活动状态时调用,用户可与之进行 UI 交互,类似 activity 的 onResume()方法。

8.onPause():

在 Fragment 处于暂停状态时调用,此时 fragment 仍可能可见,但与用户不能进行交互,类似 activity 的 onPause()方法。

9.onStop():

在 Fragment 由可见切换到不可见状态时调用,类似 activity 的 onStop()方法。

10.onDestoryView():

与 onCreateView 对应,当 fragment 的视图被销毁时调用,不过此时 Fragment 与 Activity 并未解除绑定,仍可通过 onCreateView()创建视图。

11.onDestory():

销毁 Fragment。

12.onDetach():

解除与 Activity 的关联,在 onDestroy() 方法之后调用。

下图更详细的展现了Fragment与Activity的生命周期的调用顺序:

2.Fragment 的使用

想要在 Activity 中添加 Fragment,既可以使用静态添加,也可以使用动态添加,两者的区别是,静态添加的 Fragment 固定不可切换,而动态添加方法可以随意切换不同的 Fragment。

先说静态添加 Fragment ,静态添加 Fragment 的方法使用起来很简单,我们只需要在在 Activity 的布局文件中添加一个 Fragment 控件,然后通过 android:name 属性来确定具体的 Fragment 即可。具体写法如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"> <fragment
android:id="@+id/sample_list_fragment"
android:name="com.example.projectmodule.fragment.SampleFragment" //该行确定要显示的Fragment
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>

再说动态添加 Fragment,一般我们会使用一个 FrameLayout 作为容器来装载 Fragment ,当切换不同的 Fragment 时,变化的只是 FrameLayout 的区域。xml 文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=""/>
</LinearLayout>

我们如果想要动态的切换 Fragment ,那么就必须要使用到 FragmentManager(碎片管理者)和 FragmentTransaction(碎片事务)。想要获取 FragmentManager,通过 getFragmentManager() 方法即可(如果使用的是V4包下的 Fragmnet,则使用 getSupportFragmentManager() 方法)。然后我们可以通过 FragmentManger 来开启一个事务。

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  //获得一个FragmentManager,并开启一个事务

通过使用 FragmnetTransaction 中不同的方法可以对 Fragment 进行不同的操作,主要方法如下:

1、transaction.add():

将一个碎片添加到 FragmentManager 中,第一个参数填你的 containerID ,第二个参数填你要放入的 Fragment

2、transaction.remove():

将一个碎片从 FragmentManager 中移除,一般情况下,移除的 Fragment 会被销毁。

3、transaction.hide():

隐藏 Fragment ,该方法并不会销毁 Fragmnet ,只是会将 Fragment 设为不可见。

4、transaction.show():

将隐藏的 Fragment 变为可见状态。

5、transaction.replace():

将正在显示的 Fragment 从 FragmnetManager 中移除,并且添加新的 Fragment 来替换它。(相当于调用了 remove() 方法后有调用了 add() 方法)

6、transaction.detach():

只销毁该 Fragment 的视图,并不完全销毁 Fragment(即执行了 onDestoryView() 方法,但未执行 onDestory() 方法),该 Fragment 仍然在FragmentManager 中。

7、transaction.attach():

恢复 Fragment 的视图(执行了 onCreateView() 方法)。

最后不要忘记,无论是调用了哪些方法,transaction 最后都要调用一下 commit() 方法,把事务给提交上去,否则前面的操作都不会被执行。

如果你对 FragmentPagerAdapter 和 FragmentStatePagerAdapter 比较熟悉的话,根据上述方法的介绍,就可以推论出 FragmentPagerAdapter 中移除 Fragment 时使用的是 detach() 方法,而FragmentStatePagerAdapter 中移除 Fragment 时使用的时 remove() 方法。查看源码可以发现确实是这样做的。

Fragment的通信

      Fragment 的通信主要分三种情况:Fragment 与 Activity 的通信,Activity 与 Fragment 的通信,Fragment 与 Fragment 的通信。

Fragment 与 Activity 的通信指 Fragment 如何调用 Activity 中的方法,其实我们只要在 Fragment 中的 onAttach() 之后调用 getActivity() 方法就可以得到 Fragment 的宿主 Activity 了,然后就可以调用 Activity 中的方法。不过记得在 Fragment 与 Activity 解除关联时将获得的 Activity 给释放,以免造成内存泄漏。

Activity 与 Fragment 通信指在 Activity 中调用 Fragment 的方法,这个我们一般通过回调方法来实现,我们可以在 Fragment 中声明一个接口,在 Activity 中来实现接口,以达到 Activity 调用 Fragment 中的方法。

Fragment 与 Fragment 的通信,实际上是使用了 Activity 作为中转站。我们先在一个 Fragment 中通过 getActivity() 方法得到宿主 Activity ,然后再调用 Activity 的findFragmentById() 方法或 findFragmentByTag() 方法得到另一个 Fragment,然后调用它的方法,从而实现两个 Fragment 之间的通信。

Fragment 知识巩固的更多相关文章

  1. Android开发——Fragment知识整理(二)

    0.  前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...

  2. Android开发——Fragment知识整理(一)

    0.  前言 Fragment,顾名思义是片段的意思,可以把Fragment当成Activity的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成.Fragment需要被嵌 ...

  3. android之Fragment基础详解(一)

      一.Fragment的设计哲学 Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕比手机的大得多,有 ...

  4. Android成长日记-Fragment

    (一)Android在3.0中引入了Fragment的概念,主要目的是用在大屏幕设备上—例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕要比手机大的多,有更多的空间放更多的UI组件,并且这 ...

  5. [转]【eoeAndroid索引】史上最牛最全android开发知识汇总

    一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...

  6. 【转】基于Android Fragment功能的例子

    原文网址:http://blog.csdn.net/eyu8874521/article/details/8252216 通过最近空闲时候对Fragment的学习,尝试着写了一个小Demo,将在开发的 ...

  7. 基于Android Fragment功能的样例

    通过近期空暇时候对Fragment的学习,尝试着写了一个小Demo,将在开发的时候能经常使用到的Fragment知识放在一起,写过了这个Demo对Android Fragment的了解更加深入了,以后 ...

  8. 硅谷新闻2--禁止viewpager预加载

    ContentFragment.java class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { ..... ...

  9. 最全的android学习资料

    一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...

随机推荐

  1. 087、Java数组之对象数组的静态初始化

    01.代码如下: package TIANPAN; class Book { private String title; private double price; public Book(Strin ...

  2. js动态添加li,你添加的li具有你绑定的事件

    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 <%@page i ...

  3. Jquery元素筛选、html()和text()和val三者区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Linux的几种关机命令

    在linux下一些常用的关机/重启命令有shutdown.halt.reboot.及init,它们都可以达到重启系统的目的,但每个命令的内部工作过程是不同的,通过本文的介绍,希望你可以更加灵活的运用各 ...

  5. id 和 class的区别

    id 选择器 ID 只能被指定单个元素使用,无法多个元素使用.像你的身份证号,是唯一的,id 选择器以 “#” 来定义.id选择器的优先级高于class选择器的优先级的 # userid { text ...

  6. SpringBoot如何返回页面

    SpringBoot中使用Controller和页面的结合能够很好地实现用户的功能及页面数据的传递.但是在返回页面的时候竟然会出现404或者500的错误,我总结了一下如何实现页面的返回以及这里面所包含 ...

  7. java#类的实例化顺序

    关于类的实例化,不用弄的那么细致,这里只说单一类,没有其他父类(排除Obejct)的情况.要实例化一个类,需要加载class文件到jvm并且验证通过了是安全的字节码文件. 初始化大致上是按照如下步骤: ...

  8. spoj694--Distinct Substrings

    个人第一道后缀数组题目.对于每一个后缀suffix(i),都有len-sa[i]个前缀(也即有len-sa[i]个不同的字符串),其中与排名前一位的后缀有height[i]个共同的前缀,最后所得到的新 ...

  9. ①java环境变量配置以及简单的dos框操作

    DOS:英文全称Disk Operation System,即磁盘操作系统,是个人电脑上使用的一种操作系统,并曾是世界上最广泛使用的操作系统. JDK: 英文全称Java Development Ki ...

  10. window 如何访问虚拟机的mapreduce(遇到的坑)

    首先 先把你虚拟机和本机网络链接弄通 (详情看上一篇)  一些关于mapreduce 和hadoop的配置都在上一篇 安装eclipse 的hadoop Map/Reduce插件详情 看其他博客园.. ...