• 其中大多数程序必须使用Fragments 必须实现的三个回调方法分别为:
  • onCreate
  •    系统创建Fragments 时调用,可做执行初始化工作或者当程序被暂停或停止时用来恢复状态,跟Activity 中的onCreate相当。 
  • onCreateView
  •    用于首次绘制用户界面的回调方法,必须返回要创建的Fragments 视图UI。假如你不希望提供Fragments 用户界面则可以返回NULL。 
  • onPause 
  •     当用户离开这个Fragments 的时候调用,这时你要提交任何应该持久的变化,因为用户可能不会回来。

  • 系统内置了三种Fragments ,这三种Fragments 分别有不同的应用场景分别为:
  • DialogFragment
  •  对话框式的Fragments,可以将一个fragments 对话框并到activity 管理的fragments back stack 中,允许用户回到一个前曾摒弃fragments.
  • ListFragments
  •    类似于ListActivity 的效果,并且还提供了ListActivity 类似的onListItemCLick和setListAdapter等功能。
  • PreferenceFragments
  •    类似于PreferenceActivity .可以创建类似IPAD的设置界面。 

可以分为下面的几部分:

  1.   使用支持库
  2.   创建一个Fragment
  3.   创建一个动态UI
  4.   多个Fragment之间的通信

1、使用支持库

如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容。

如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来构建。android-support-v4.jar

2、创建一个Fragment

      Fragment支持在不同的Activity中使用并且可以处理自己的输入事件以及生命周期方法等。可以看做是一个子Activity

创建一个Fragment

    创建一个Fragment和创建一个Activity很类似,继承Fragment类,重写生命周期方法,主要的不同之处就是需要重写一个onCreateView()方法来返回这个Fragment的布局

   
   
   
   
  1. public class Fragment1 extends Fragment{ 
  2.     @Override 
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  4.             Bundle savedInstanceState) { 
  5.         // TODO Auto-generated method stub 
  6.         super.onCreateView(inflater, container, savedInstanceState); 
  7.         return inflater.inflate(R.layout.fragment, container,false); 
  8.     } 

     Fragment的生命周期方法依赖于Activity的生命周期,例如一个ActivityonPause()的生命周期方法被调用的时候这个Activity中的所有的FragmentonPause()方法也将被调用。

使用XML添加FragmentActivity

尽管Fragment可以被多个Activity重用,但是您也必须把Fragment关联到一个FragmentActivity上。可以使用XML布局文件的方式来实现这种关联。

上面的所说的FragmentActivity适用在API3.0以下的版本,3.0及以上的版本可以使用普通的Activity

fragment.xml

   
   
   
   
  1. xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="match_parent" 
  4.     android:layout_height="match_parent" 
  5.     android:orientation="vertical" > 
  6.  
  7.     <TextView 
  8.         android:layout_width="match_parent" 
  9.         android:layout_height="match_parent" 
  10.         android:text="Fragment" /> 
  11.  
  12. LinearLayout> 

 activity_main.xml

   
   
   
   
  1. xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="match_parent" 
  4.     android:layout_height="match_parent" 
  5.     android:orientation="vertical" > 
  6.  
  7.      
  8.     <fragment 
  9.         android:id="@+id/fragment1" 
  10.         android:name="com.example.demo.Fragment.Fragment1" 
  11.         android:layout_width="match_parent" 
  12.         android:layout_height="0dp" 
  13.         android:layout_weight="1" > 
  14.     fragment> 
  15.  
  16.     <fragment 
  17.         android:id="@+id/fragment2" 
  18.         android:name="com.example.demo.Fragment.Fragment1" 
  19.         android:layout_width="match_parent" 
  20.         android:layout_height="0dp" 
  21.         android:layout_weight="1" > 
  22.     fragment> 
  23.  
  24. LinearLayout> 

MainActivity.java

   
   
   
   
  1. //3.0以下必须使用FragmentActivity 
  2. public class MainActivity extends FragmentActivity { 
  3.  
  4.     @Override 
  5.     protected void onCreate(Bundle savedInstanceState) { 
  6.         super.onCreate(savedInstanceState); 
  7.         setContentView(R.layout.activity_main); 
  8.     } 
  9.  

Fragment1.java

   
   
   
   
  1. public class Fragment1 extends Fragment{ 
  2.     @Override 
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  4.             Bundle savedInstanceState) { 
  5.         // TODO Auto-generated method stub 
  6.         super.onCreateView(inflater, container, savedInstanceState); 
  7.         return inflater.inflate(R.layout.fragment, container,false); 
  8.     } 

上面就是第一个例子的代码 可运行在3.0以下的系统上

当您添加一个片段一个活动布局定义的布局XML文件中的片段,你不能删除在运行时的片段。如果您打算在用户交互和交换片段,你必须添加的活性片段的活动时第一次启动。

3、构建一个灵活的UI

     FragmentManager提供了对Activity运行时的Fragment的添加、删除、替换的操作。

    在Activity运行期间你可以添加Fragment而不是在XML布局文件中进行定义。如果你打算在Activity中改变Fragment的生命过程。

    如果要执行添加、删除、修改的操作,你必须通过FragmentManager的对象获得一个FragmentTransaction对象,通过它的API来执行这些操作。

    添加一个Fragment到一个Activity,必须把这个Fragment添加到一个容器视图中。

    在Activity中你可以通过getFragmentManager()来获得Fragment对象,然后通过FragmentManager对象的beginFragmentTransaction()方法来获得FragmentTransaction对象。通过它的add()方法来添加一个Fragment到当前的Activity中。

activity_main.xml

   
   
   
   
  1. xml version="1.0" encoding="utf-8"?> 
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:id="@+id/fragment_container" 
  4.     android:layout_width="match_parent" 
  5.     android:layout_height="match_parent" 
  6.     android:orientation="vertical" > 
  7.  
  8. LinearLayout> 

    一个FragmentTransaction对象可以执行多个增删修的方法,如果你想把这些修改提交到Activity上,必须在最后调用一下这个对象的commit()方法。

   
   
   
   
  1. public class MainActivity extends FragmentActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.  
  8.         Fragment1 fragment1 = new Fragment1(); 
  9.          
  10.         //3.0之前需要getSupportFragmentManager() 
  11.         //3.0之后只需getFragmentManager() 
  12.         getSupportFragmentManager().beginTransaction() 
  13.                 .add(R.id.fragment_container, fragment1).commit(); 
  14.     } 
  15.  

   如果替换或者删除一个Fragment然后让用户可以导航到上一个Fragment,你必须在调用commit()方法之前调用addToBackStack()方法添加到回退栈。如果你把这个Fragment添加到了回退栈,在提交之后这个Fragment是会被Stop而不是Destroyed。如果用户导航到这个Fragment,这个Fragment会被Restart而不是重新创建。如果你没有把它添加到回退栈,则在删除或者替换的时候它将被Destroyed

   
   
   
   
  1. public class MainActivity extends FragmentActivity { 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.  
  8.         Fragment1 fragment1 = new Fragment1(); 
  9.         // 3.0之前需要getSupportFragmentManager() 
  10.         // 3.0之后只需getFragmentManager() 
  11.         FragmentTransaction transaction = getSupportFragmentManager() 
  12.                 .beginTransaction(); 
  13.         transaction.replace(R.id.fragment_container, fragment1); 
  14.         transaction.addToBackStack(null); 
  15.         transaction.commit(); 
  16.     } 

4、与其他Fragment的交互

    两个单独的Fragment之间是不应该进行通信的。应该使用他们所存在的Activity作为沟通的纽带。

    为了实现两个Fragment的交互,您可以在Fragment中定义一个接口,然后再这个接口中定义一个方法,在FragmentonAttach()方法中调用这个接口中的方法。然后让Activity实现这个方法来完成ActivityFragment之间的通信。

   
   
   
   
  1. public class MainActivity extends FragmentActivity  implements Fragment1.Testinterface{ 
  2.  
  3.     @Override 
  4.     protected void onCreate(Bundle savedInstanceState) { 
  5.         super.onCreate(savedInstanceState); 
  6.         setContentView(R.layout.activity_main); 
  7.  
  8.         Fragment1 fragment1 = new Fragment1(); 
  9.         // 3.0之前需要getSupportFragmentManager() 
  10.         // 3.0之后只需getFragmentManager() 
  11.         FragmentTransaction transaction = getSupportFragmentManager() 
  12.                 .beginTransaction(); 
  13.         transaction.replace(R.id.fragment_container, fragment1); 
  14.         transaction.addToBackStack(null); 
  15.         transaction.commit(); 
  16.     } 
  17.  
  18.     @Override 
  19.     public void Test(String msg) { 
  20.         // TODO Auto-generated method stub 
  21.         Log.e("----", msg); 
  22.     } 

 

   
   
   
   
  1. package com.example.demo.Fragment; 
  2.  
  3. import com.example.demo.R; 
  4.  
  5. import android.app.Activity; 
  6. import android.os.Bundle; 
  7. import android.support.v4.app.Fragment; 
  8. import android.view.LayoutInflater; 
  9. import android.view.View; 
  10. import android.view.ViewGroup; 
  11.  
  12. public class Fragment1 extends Fragment{ 
  13.     Testinterface testinterface; 
  14.      
  15.     public interface Testinterface{ 
  16.         public void Test(String msg); 
  17.     } 
  18.      
  19.     @Override 
  20.     public void onAttach(Activity activity) { 
  21.         // TODO Auto-generated method stub 
  22.         super.onAttach(activity); 
  23.          
  24.         try { 
  25.             testinterface  = (Testinterface)activity; 
  26.         } catch (Exception e) { 
  27.             // TODO: handle exception 
  28.             System.err.println(e.toString()); 
  29.         } 
  30.      
  31.     } 
  32.     @Override 
  33.     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
  34.             Bundle savedInstanceState) { 
  35.         // TODO Auto-generated method stub 
  36.         super.onCreateView(inflater, container, savedInstanceState); 
  37.         testinterface.Test("测试"); 
  38.         return inflater.inflate(R.layout.fragment, container,false); 
  39.     }