前段时间在开发中使用到了Fragment,由于不了解,碰到了不少坑,于是系统学习了下相关的文档和代码,在这里做个总结,本文总结至android开发文档中的Fragment的介绍文档(点这里),本文中的代码和图片也都来自这篇文档。


简介

         Fragment是一种比activity更小的android ui组件,通过Fragment,我们可以设计出更小粒度的UI模块,这样,我们的UI界面的开发可以更加灵活,更加具有复用性。
         Fragment与Activity很像,它也有自己的生命周期和对应的生命周期函数,看起来,Google设计Fragment可以是为了解决activity较重,不太利于复用的问题。Fragment必须嵌入到activity中才能使用,因此Fragment的生命周期会受到Activity的影响,例如当一个Activity pause时,这个Activity内部所有的Fragment都会处于Pause状态,同样一个Activity destroy时,其内部所有的Fragment都会destroy。

设计理念

        在android3.0之后,手机屏幕变得越来越大,android平板也逐渐流行,这导致单个activity中包含的内容越来越多,维护和复用都变得困难重重。为了解决这个问题,android引入了Fragment,通过使用fragment 可以缩小用户对界面的操纵粒度,提升UI的灵活性和复用性。

Fragment的使用方法

        在android3.0之后,应用可以直接使用fragment和相关的类即可。而3.0之前的应用如果想要使用fragment,需要引入android.support.v4 这个包,并使用这个包中相关的类。使用Fragment需要以下几步:

1.定义一个继承类

         创建一个类继承Fragment,android3.0及以上可以直接继承android.app.Fragment, android2.3及以下需要导入android.support.v4 这个包,之后再继承android.support.v4.app.Fragment。对于android2.3及以下版本,同时还要确保用来容纳Fragment的Activity必须从android.support.v4.app.FragmentActivity继承下来。

2.覆盖三个方法

        覆盖的三个方法都是生命周期的回调方法         1. onCreate。当创建Fragment时会调用这个方法,在这个方法中初始化Fragment相关的组件         2. onCreateView。当系统需要绘制这个fragment时,调用这个方法,在这个方法中创建Fragment的View并将根节点return出去。         3. onPause。当用户离开这个Fragment时候调用这个回调。在这个回调中将所有需要保存的保存好。

3.将Fragment添加到activity中

Fragment需要依附于activity才能运行,因此我们需要将Fragment添加到activity中,有两种添加的方法。         1.直接在activity的layout中声明。 [html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="horizontal"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent">  
  6.     <fragment android:name="com.example.news.ArticleListFragment"  
  7.             android:id="@+id/list"  
  8.             android:layout_weight="1"  
  9.             android:layout_width="0dp"  
  10.             android:layout_height="match_parent" />  
  11.     <fragment android:name="com.example.news.ArticleReaderFragment"  
  12.             android:id="@+id/viewer"  
  13.             android:layout_weight="2"  
  14.             android:layout_width="0dp"  
  15.             android:layout_height="match_parent" />  
  16. LinearLayout>  
        以上fragment标签中的android:name及是Fragment的类名,这是一种静态声明的方法。当activity的layout被创建时,系统将实例化这两个Fragment。fragment标签中的android:id属性的作用在于,我们可以通过FragmentManager的findFragmentById方法来获取到对应的Fragment实例。更多的时候,我们需要的可能是动态添加Fragment,方法如下。         2.动态添加Fragment         首先,我们需要找到一个用来容纳Fragment的ViewGroup。         然后,获取FragmentManager对象         对于android3.0及以上版本,使用 [java] view plaincopy
  1. FragmentManager fragmentManager = getFragmentManager()  
       对于android2.3及以下版本,使用 [java] view plaincopy
  1. FragmentManager fragmentManager = getSupportFragmentManager()  
         最后,将Fragment加入到activity中 [java] view plaincopy
  1. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  
  2. ExampleFragment fragment = new ExampleFragment();  
  3. fragmentTransaction.add(R.id.fragment_container, fragment);  
  4. fragmentTransaction.commit();  

Fragment的生命周期

1.Fragment生命周期,如图所示。


2.Fragment生命周期的回调函数

onAttach:当Fragment第一次Attach到Activity时调用。生命周期中的第一个回调 onCreate:初次创建Fragment时候调用 onCreateView:创建Fragment UI的时候调用,对于有View的Fragment,在这个函数里,需要返回一个View对象(Fragment view的root) onActivityCreated:当Fragment依附的activity和Fragment的View创建完成后调用。这是最后一个初始化的回调,在这个函数中调用可以做一些数据恢复的动作(从task列表恢复的情况) onStart:当Fragment对用户可见时调用 onResume:当Fragment对用户可见并且处于Active状态时调用 onPause:当Fragment被deactive的时候调用 onStop:当Fragment对用户不可见的时候调用 PS:以上四个生命周期函数一般都又Activity的生命周期函数所触发。 onDestroyView:当Fragment的View被从layout中移除时调用。 onDestroy:当Fragment不再被使用时调用。 onDeattch:当Fragment不再attach到activity时候调用。最后一个回调函数。

管理Fragment


1.FragmentManager

   FragmentManager提供了管理Fragment的功能包括
  1. 通过Tag/ID查找Fragment。findFragmentByTag()和findFragmentById()。
  2. 维护一个Fragment的back stack,通过这个back stack可以模拟类似activity的back行为
  3. back stack的监听接口addOnBackStackChangedListener

2.FragmentTransaction

        使用FragmentTransaction来对Fragment进行操作,我们可以通过FragmentManager的接口来得到一个FragmentTransaction对象。
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        FragmentTransaction支持的操作有add(), remove(), replace()等,我们可以使用FragmentTransacation执行一系列的操作,最后调用commit让这些操作生效。FragmentManager会为FragmentTransaction维护一个back stack,可以调用FragmentTransaction的addToBackStack方法来将这个Transaction中得操作加入到back stack,已经加入到back stack的Transaction将来可以被回滚。commit函数调用后,操作并不会立即commit,如果想要立即commit,可以调用FragmentMan的executePendingTransactions方法。注意,如果当前activity不是处于active状态,那么调用commit会导致一个exception,因为这个状态下,fragment的状态会丢失掉,原因可能因为activity中所有fragment的状态会在activity的onSaveInstanceState中保存,一旦activity已经inactive那么onSaveInstanceState很有可能已经被调用过了,那个这个时候在去修改fragment的状态,当然无法得到保存。使用commitAllowingStateLoss 可以显示告诉系统,我们不在意状态丢失,这样系统就不会抛出这个异常了。        detach和remove的区别。这里的detach和Fragment生命周期中的onDetach方法并不是对应的。使用detach,这个Fragment只会调用onDestroyView,而不会onDestroy,因此这样,我们可以在使用attach将它再次加入到layout中(view会重新创建)。而使用remove则要看FragmentTransaction是否被添加到了back stack中,如果没有添加,则Fragment会直接被destroy。

更多相关文章

  1. android 模拟器创建的sdcard 没有mount
  2. ADB适用方法
  3. android艺术开发探索之RemoteViews跨进程更新UI
  4. Android(安卓)Sensor HAL层初始化流程(基于Qualcomm平台)
  5. Android中多线程的handler与Thread
  6. android 事件机制,捕捉与事件监听总结整理(二)Event Handlers,Handli
  7. app launcher 名称不是清单文件中的android:label
  8. android 拦截机制的分析
  9. android 数据传递详解(Serialization、Parcelable、Parcel、Inten

随机推荐

  1. Android的手势操作识别
  2. [Accessibility] Missing contentDescrip
  3. 【Android】getDimension,getDimensionPi
  4. Android显式intent和隐式intent
  5. Android开发--Intent-filter属性详解 (转
  6. 获取手机的mac地址
  7. android 初始化时获得控件位置,宽高的属性
  8. Android(安卓)Donut Makefile分析之一 (b
  9. Android(安卓)Handler消息机制中的Thread
  10. 获取手机中已安装apk文件信息(PackageInf