Fragment的使用小结(一)

来源:互联网 发布:private equity 知乎 编辑:程序博客网 时间:2024/06/10 07:14

现在很多app应用都使用了Fragment,不仅仅是因为Fragment使得UI设计更加灵活,还有在性能上有大幅度提高,并且占用内存降低,在同样的界面Activity占用内存比Fragment要多,响应速度Fragment比Activty在中低端手机上快几倍!

  • 官方介绍:

A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running (sort of like a “sub activity” that you can reuse in different activities).

翻译: Fragment是Activity的一部分内容. 你可以在一个单独的Activity中合并放置多个Fragment, 用来构建一个多面板的UI界面, 并且还可以复用Fragment在多个Activity. 可以把他想成是Activity的一个子模块. 你可以在Activity运行时, 添加或移除Fragment.拥有自己的生命周期, 接收自己的事件.(类似于一个可以在不同Activity种复用的子Activity)。本篇文章我主要介绍以下几个基础知识点,下篇重点说明Fragment与Fragment、Activity通信:

  • Fragment的创建和使用
  • Fragment的生命周期
  • Fragment常用方法 add(), show(), hide(), replace()

一.Fragment的创建和使用

静态创建
注意:
1. 配置andriod:name指定在layout中实例化的Fragment类
2. 至少配置 id 或 tag, 否则会抛异常
1.在布局文件中添加Fragment的布局中配置fragment标签

 <fragment        android:id="@+id/fragment_first"        android:tag="first"        android:name="cn.huyaru.com.fragmentdemo.FirstFragment"        android:layout_width="match_parent"        android:layout_height="match_parent"        />

2.创建Fragment的布局文件
3.创建Fragment, 重写onCreateView, 配置真正内容

public class FirstFragment extends Fragment {    //  重写 onCreateView 配置布局内容    /**     * @param inflater           布局填充器, 打气筒     * @param container          Fragment所在的布局容器     * @param savedInstanceState 之前保存的状态     * @return     */    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        /** * resource:Fragment需要加载的布局文件          * root:加载layout的父ViewGroup          * attactToRoot:false,不返回父ViewGroup          * */        View rootView = inflater.inflate(R.layout.fragment_first , container , false);        return rootView;    }}

动态创建
1. 在layout布局中添加一个布局容器

<FrameLayout            android:id="@+id/container"            android:layout_width="match_parent"            android:layout_height="match_parent" >        </FrameLayout>

2.创建Fragment, 重写onCreateView, 配置真正内容
3.通过Fragment管理器添加/替换Fragment

// 1. 获取Fragment管理器.        FragmentManager fm = getFragmentManager();        // 2. 开启Fragment处理事务.        FragmentTransaction ft = fm.beginTransaction();        // 3. 进行Fragment操作        ft.replace(R.id.container, new FirstFragment());        // 4. 进行事务的提交        ft.commit();

Fragment的向下兼容

  • Fragment是在Andriod3.0才出现的. API11
  • v4包提供了Fragment, 将Fragment兼容到3.0及以下版本.

  • 不同的地方:

    1. Fragment继承 android.support.v4.app.Fragment
    2. Activity继承 android.support.v4.app.FragmentActivity
    3. getFragmentManager() -> getSupportFragmentManager() 获取管理器

二 .Fragment的生命周期
Fragment总是必须被嵌入到一个activity中。它们的生命周期直接受其宿主activity的生命周期影响。

Activity和Fragment生命周期之间的关系

  • onAttach()
    当fragment被绑定到activity时被调用(Activity会被传入)。
  • onCreateView()
    创建和fragment关联的view hierarchy时被调用。
  • onActivityCreated()
    当activity的onCreate()方法返回时被调用。
  • onDestroyView()
    当和fragment关联的view hierarchy被移除时调用。
  • onDetach()
    当fragment从activity解除关联时被调用。
    注意
  • 通过布局文件的fragment标签关联的Fragment的生命周期
    特点:跟Activity的生命周期高度的吻合。
  • 通过代码动态添加的Fragment的生命周期
    特点:当提交事务之后,才会走生命周期方法。
    activity和fragment的生命周期最显著的差异是各自如何在它的后台堆栈中储存。默认情况下,activity在停止后,它会被放到一个由系统管理的用于保存activity的back stack(因此用户可以使用BACK按键导航回退)。但是,当你在一个事务期间移除fragment时,只有显式调用addToBackStack()请求保存实例,才会被放到一个由宿主activity管理的back stack(会退栈)。

三. Fragment常用方法(add(), show(), hide(), replace())

  • 通过add方法(效率高)
    特点:第一次add的时候执行生命周期方法,之后的show和hide是不影响生命周期的
  • 通过Replace方法(少,效率低)
    特点:没replace一次,就会把之前老的Fragment给销毁掉,然后重新创建一个新的。
    注意:如果你的app有大量图片,这时更好的方式可能是replace,配合你的图片框架在Fragment视图销毁时,回收其图片所占的内存。
2 0
原创粉丝点击