Fragment 知识巩固

重新学习 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() 方法之后调用。

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="1"/>
</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() 方法。查看源码可以发现确实是这样做的。

时间: 2024-12-06 12:09:47

Fragment 知识巩固的相关文章

android之Fragment基础详解(一)

一.Fragment的设计哲学 Android在3.0中引入了fragments的概念,主要目的是用在大屏幕设备上--例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互. 针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以适应平板神马超级大屏的.难道无法做到一个App可以同时适应手机和平板么,当然了,必须有啊.Fragment的出现就是为了解决这样的问题.你可以把Frag

Android成长日记-Fragment

(一)Android在3.0中引入了Fragment的概念,主要目的是用在大屏幕设备上—例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕要比手机大的多,有更多的空间放更多的UI组件,并且这些组件之间会产生更多的交互 (二)Fragment在你的应用中应当是一个模块化和可重用的组件,因为Fragment定义了他自己的布局,以及通过使用他自己的生命周期回调方法定义了他自己的行为,你可以将Fragment包含到多个activity中 (三)[Fragment知识概要] (1)Fragmen

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

原文网址:http://blog.csdn.net/eyu8874521/article/details/8252216 通过最近空闲时候对Fragment的学习,尝试着写了一个小Demo,将在开发的时候能常用到的Fragment知识放在一起,写过了这个Demo对Android Fragment的了解更加深入了,以后做起有关的项目也会顺手很多,下面先贴上几张实现之后的图片: 实现的功能很简单,也是最基本的,上下分别是两个Fragment,上面的Fragment中是一个listview,当点击it

基于Android Fragment功能的样例

通过近期空暇时候对Fragment的学习,尝试着写了一个小Demo,将在开发的时候能经常使用到的Fragment知识放在一起,写过了这个Demo对Android Fragment的了解更加深入了,以后做起有关的项目也会顺手非常多,以下先贴上几张实现之后的图片: 实现的功能非常easy,也是最主要的,上下各自是两个Fragment,上面的Fragment中是一个listview,当点击item时,以下的Fragment显示相应的文字具体信息:                 详细的实现过程例如以下

Fragment的知识总结

1. Fragment概念及作用. 以下是使用Fragment提供思路 2. 创建继承于 Fragment的类:(可extends Fagment 或  ListFagment) 注意导包:如果考虑兼容就用  android.support.v4.app.ListFragment; 以下内容只是创建Fargment的例子 package ainux.bing.fragmentsingleactivity.Fragments; import android.content.Intent; impo

Android知识巩固 二 Fragment

一.Fragment为什么被称为第五大组件 二.Fragment的生命周期 三.Fragment之间的通信 四.Fragment管理器:FragmentManager 一 Fragment为什么可以会被称为第五大组件 Android 3.0 开始引入的API,Fragment英文翻译是碎片的意思.也可以把它当作Activity的子控件,Fragment的使用都是在Activity里面的,受Activity的生命周期影响.当然,它本身具有自己的生命周期.Android 3.0引入Fragment的

对fragment的学习

一直对fragment一知半解,今天在运行一个项目的时候,有用到fragment,所以好好地复习了下fragment的知识: 1.fragment的生命周期: 2.在一个访问fragment中的资源可以在 public void onActivityCreated(Bundle savedInstanceState){}方法中 3. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle save

【Android基础】Fragment 详解之Fragment生命周期

上一篇文章简单介绍了一下Fragment,这一篇文章会详细的说一下Fragment的生命周期和创建一个用户界面. Fragment的主要功能就是创建一个View,并且有一个生命周期来管理这个View的创建和销毁.Fragment的生命周期与Activity的生命周期类似,都会有一些回调方法,你所做的工作就是利用好这些生命周期方法,在恰当的方法中做恰当的工作. Fragment的生命周期与Activity的状态图如下: 左侧是Activity的生命周期状态,右侧对应的是这个状态下回执行Fragme

用Fragment实现Tab页面切换效果初步总结

前言: 最近在Android项目中需要在活动中实现多页面切换的功能,第一次是实现的过程中,是让Activity同时去加载三个界面的,通过点击tab按钮对页面设置隐藏和显示,实现页面切换效果,但是后面发现这种实现方式其实存在很多问题: 首先,同时去加载三个页面,切换Activity的速度会变慢,尤其是布局中如果有很多ImageView,ImageButton等使用到图片资源的控件时,切换效果非常不好: 其次,由于使用了很多图片资源,在退出Activity的时候,像Drawable,Bitmap等一