首页 > 代码库 > Fragment深入理解(二)

Fragment深入理解(二)

Fragment:碎片、片段,碎片表示轻量级和灵活,是开发android平板电脑必须掌握的技术。其将界面UI进行分块,以块的方式组织UI,完全可以达到界面UI组件的复用。

1、 它在一个activity里面表示一个行为或者用户接口的一部分。

        我们可以将不同的Fragments组合起来放到一个activity中,或者在不同的activity中重用一个fragment。你可以将一个fragment看成是一个activity中的一个片段,它有自己的生命周期(如何从创建到销毁),接受它自己的输入事件,并且可以在activity运行时动态的添加或者移除一个fragment。

2、  一个fragment必须总是绑定到一个activity中,虽然fragment有自己的生命周期,但同时也被它的宿主activity的生命周期直接影响。

        比如,当一个activity暂停的时候,它里面所有的fragments也同样暂停;当activity销毁的时候,它里面所有的fragment同样也被销毁;然而,当一个activity正在运行(它处于resumed生命周期的时候),我们可以独立的操纵每个fragment执行注入添加和移除它们;另外,当你执行一个fragment操作的时候,你可以将它添加到一个历史栈里面去,这个栈是由它的宿主activity维护,每一个栈里面的元素都是一个已经被执行过的fragment。这个堆栈可以让我们通过返回键来恢复之前的fragment。

3、  fragment可以定义自己的布局文件(layout),当然其也可以没有自己的UI。

        当你将一个fragment作为activity的布局文件的一部分添加进去的时候,它就在activity的视图层次中的ViewGroup中。(1)可以通过在activity的layout中定义<fragment>元素来定义一个类中的fragment。(2)或者在代码中将其添加到当前的ViewGroup(视图组合,或者称为视图元素组合)中。注意:一个fragment并不一定要求是activity布局文件的一部分,我们也可以使用一个没有自己UI的fragment,作为一个activity不可见的一部分。

注:Fragment是android3.0版本开始提供的技术,google为了能够兼容1.6以上的版本,提供了android-support-v4.jar包。可以通过SDK Manager下载AndroidSupport Package,在Extras目录下的Android Support。使用时你需要在项目代码顶层创建libs文件夹,并将该jar库文件拷贝到libs里面去。下面使用该jar来研究fragment。

 

4、Fragment对象的生命周期。

1、创建布局文件layout1

 

 

[java] view plaincopy
 
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:layout_gravity="center"  
  5.     android:gravity="center_vertical"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <TextView  
  9.         android:id="@+id/textView1"  
  10.         android:layout_width="wrap_content"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="My First Fragment for android1.6"  
  13.         android:textColor="#ff00ff"  
  14.         android:textSize="33sp" />  
  15.   
  16. </LinearLayout>  

 

2、 创建activity_main布局文件

 

[java] view plaincopy
 
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:gravity="center"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <TextView  
  9.         android:layout_width="wrap_content"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_centerHorizontal="true"  
  12.         android:layout_centerVertical="true"  
  13.         android:text="@string/hello_world"  
  14.         tools:context=".MainActivity" />  
  15.     <fragment  
  16.         android:name="com.example.myfragment.MyFragment1"  
  17.         android:id="@+id/myfragment1"  
  18.     android:tag="MyFragment"  
  19.         android:layout_width="wrap_content"  
  20.         android:layout_height="wrap_content"/>  
  21.   
  22. </LinearLayout>  

 

3、创建MyFragment1

 

[java] view plaincopy
 
  1. package com.example.myfragment;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.support.v4.app.Fragment;  
  6. import android.util.Log;  
  7. import android.view.LayoutInflater;  
  8. import android.view.View;  
  9. import android.view.ViewGroup;  
  10.   
  11. public class MyFragment1 extends Fragment{  
  12.     @Override  
  13.     public void onAttach(Activity activity) {  
  14.         // TODO Auto-generated method stub  
  15.         Log.d(this.getTag(), "onAttach");  
  16.         super.onAttach(activity);  
  17.     }  
  18.   
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         // TODO Auto-generated method stub  
  22.         Log.d(this.getTag(), "onCreate");  
  23.         super.onCreate(savedInstanceState);  
  24.     }  
  25.   
  26.     @Override  
  27.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  28.             Bundle savedInstanceState) {  
  29.         // TODO Auto-generated method stub  
  30.         Log.d(this.getTag(), "onCreateView");  
  31.         return inflater.inflate(R.layout.layout1, container,false);  
  32.     }  
  33.   
  34.     @Override  
  35.     public void onActivityCreated(Bundle savedInstanceState) {  
  36.         // TODO Auto-generated method stub  
  37.         Log.d(this.getTag(), "onActivityCreated");  
  38.         super.onActivityCreated(savedInstanceState);  
  39.     }  
  40.   
  41.     @Override  
  42.     public void onStart() {  
  43.         // TODO Auto-generated method stub  
  44.         Log.d(this.getTag(), "onStart");  
  45.         super.onStart();  
  46.     }  
  47.   
  48.     @Override  
  49.     public void onResume() {  
  50.         // TODO Auto-generated method stub  
  51.         Log.d(this.getTag(), "onResume");  
  52.         super.onResume();  
  53.     }  
  54.   
  55.     @Override  
  56.     public void onPause() {  
  57.         // TODO Auto-generated method stub  
  58.         Log.d(this.getTag(), "onPause");  
  59.         super.onPause();  
  60.     }  
  61.   
  62.     @Override  
  63.     public void onStop() {  
  64.         // TODO Auto-generated method stub  
  65.         Log.d(this.getTag(), "onStop");  
  66.         super.onStop();  
  67.     }  
  68.   
  69.     @Override  
  70.     public void onDestroyView() {  
  71.         // TODO Auto-generated method stub  
  72.         Log.d(this.getTag(), "onDestroyView");  
  73.         super.onDestroyView();  
  74.     }  
  75.   
  76.     @Override  
  77.     public void onDestroy() {  
  78.         // TODO Auto-generated method stub  
  79.         Log.d(this.getTag(), "onDestroy");  
  80.         super.onDestroy();  
  81.     }  
  82.   
  83.     @Override  
  84.     public void onDetach() {  
  85.         // TODO Auto-generated method stub  
  86.         Log.d(this.getTag(), "onDetach");  
  87.         super.onDetach();  
  88.     }  
  89.       
  90. }  

4、创建MainActivity文件

 

 

[java] view plaincopy
 
  1.  package com.example.myfragment;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v4.app.FragmentActivity;  
  5.   
  6. public class MainActivity extends FragmentActivity {  
  7. //这里是继承FrameActivity,而不是Activity  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.activity_main);  
  12.     }  
  13.   
  14. }  

 

执行,然后再按home’键,再进入程序,再按back键,效果如下:

   

注:

1、引用了android.support.v4.app.*;包中的组件;

2、为了兼容android1.6,MainActivity继承于FrameActivity;

3、改代码中fragment已写入xml中,缺点是不能实现动态的增删,后面的学习将使用代码来进行添加删除fragment。

4、onCreateView方法中,inflater.inflate(R.layout.layout1,container,false);

第一个参数把某一布局文件转换成view对象;

第二参数是把这个view对象放入container容器中;这个container容器其实就是activity_main的根节点,可以通过在根节点下设置tag属性,并通过container.getTag()获取值,再将其打印出来。

第三个参数代表是否把这个view对象添加到container容器内部,在xml中我们已经将它添加到容器内部。经测试,如果此时你再将之设置为true,其依然能够正确执行。

5、Fragment的生命周期分析

 

 

(1)、onAttach()//当一个Fragment对象关联到一个Activity时调用。

(2)、onCreate()//初始创建Fragment对象时调用。

(3)、onCreateView()//创建与Fragment对象关联的View视图时调用。

(4)、onActivityCreated()//当Activity对象完成自己的onCreate方法时调用。

(5)、onStart()//Fragment对象在ui可见时调用。

(6)、onResume()//Fragment对象的ui可以与用户交互时调用。

(7)、onPause()//Fragment对象可见,但不可交互。有Activity对象转为onPause状态时调用。

(8)、onStop()//有空间完全遮挡;或者宿主Activity对象转为onStop状态时调用。

(9)、onDestroyView()//Fragment对象清理view资源时调用,也就是移除fragment中的视图。

(10)、onDestroy()//Fragment对象完成对象清理View资源时调用。

(11)、onDetach()//Fragment对象没有与Activity对象关联时调用。

当一个fragment被创建的时候执行1-4;

当这个fragment创建完毕,到对用户可见的时候,执行5-6;

当这个fragment从可见到不可见时,执行7-8;

当这个fragment被销毁了(或者持有它的activity被销毁了),执行9-11;

另外在3-5,可以使用Bundle对象保存一个fragment的对象。

 

Fragment深入理解(二)