Fragment应用的介绍

对于Fragment的应用,Google 文档中介绍的和详细,但是它有一个约束,就是只能是在SDK3.0以上,对于低版本的不适用。后来Google又经过了改进,添加了附加包。

在这里,SDK1.6的版本也可以使用Fragment。

一、将Google开发的额外包加入工程

包地址:android-sdk-windows\extras\android\compatibility\v4\android-support-v4

二、Fragment的定义

[java] view plain copy
  1. public class FragMentPageA extends Fragment {  
  2.     @Override  
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  4.             Bundle savedInstanceState) {  
  5.         return inflater.inflate(R.layout.fragment_a, container, false);  
  6.     }  
  7. }  

创建一个继承与Fragment的类,然后实现里面的方法onCreateView();

参数说明

inflater:要填充的Layout;

containner:参数inflater的父视图(inflater将嵌入container中)

savedInstanceState:当试图退出是用它保存状态数据,初始化时可以从savedInstanceState中读取上次退出时的状态数据;


R.layout.fragment_a为一个xml布局文件:
[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical"  
  6.     android:background="#ffff0000" >  
  7.     <Button android:id="@+id/btn"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="Change page"/>  
  11.     <TextView  
  12.         android:id="@+id/text_a"  
  13.         android:layout_width="fill_parent"  
  14.         android:layout_height="wrap_content"  
  15.         android:text="this is fragment A"  
  16.         android:layout_gravity="center" />  
  17.   
  18. </LinearLayout>  

三、管理Fragment

实现的Activity必须是继承:FragmentActivity,而3.0不需要

FragmentManager fragmentMgr = getSupportFragmentManager();

FragmentTransaction ft = fragmentMgr.beginTransaction();

FragMentPageA  fragmentA = new FragMentPageA();

ft.add(R.id.layout_two, fragmentA);//R.id.layout_two是一个布局文件中的id,将fragmentA插入到布局文件Id为R.id.layout_two的GroupView中;

也可以用FragmentTransaction中的方法remove()replace() hide() show() 等方法进行各种操作,但这些方法调用完后一定要记得commit()才可以让你前面的操作实现。

注意:在动态添加Fragment时,有可能会多次调用add()或者remov()等操作方法,这时候一定不能把FragmentTransaction作为这个Calss中的成员变量(否则会出现commit already has been called 或者别的Bug),我们可以将它设置为本地变量,例如,什么时候用到的时候在定义它,但是我们可以把FragmentManager 定义为Calss的成员。

也有一种方法将Fragment直接插入到布局文件中:
[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="horizontal" >  
  6.     <fragment class="com.example.fragment.FragMentPageA"  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="fill_parent"  
  9.         android:layout_weight="1"/>  
  10.     <LinearLayout android:id="@+id/layout_two"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="fill_parent"  
  13.         android:orientation="vertical"  
  14.         android:layout_weight="1"/>   
  15. </LinearLayout>  

好了,为了更具体的说明,下面看一个完整的例子,该实例是用三个Fragment构成,当点击第一个Fragment中的Button是第二个和第三个Fragment相互切换显示,
其中FragMentPageA是直接插入到布局文件中的,FragMentPageB和FragMentPageC在Activity中动态定义的。
Fragment应用的介绍_第1张图片 Fragment应用的介绍_第2张图片
定义包含类FragMentPageA的填充内容的布局文件fragment_a.xml:
[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical"  
  6.     android:background="#ffff0000" >  
  7.     <Button android:id="@+id/btn"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="Change page"  
  11.         android:textSize="30dp"/>  
  12.     <TextView  
  13.         android:id="@+id/text_a"  
  14.         android:layout_width="fill_parent"  
  15.         android:layout_height="wrap_content"  
  16.         android:text="this is fragment A"  
  17.         android:layout_gravity="center"  
  18.         android:textSize="30dp" />  
  19.   
  20. </LinearLayout>  

定义包含类FragMentPageB的填充内容的布局文件fragment_b.xml:

[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical"   
  6.     android:background="#ff0f0f0f">  
  7.   
  8.     <TextView  
  9.         android:id="@+id/text_b"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="this is fragment B"  
  13.         android:layout_gravity="center"  
  14.         android:textSize="30dp" />  
  15.   
  16. </LinearLayout>  

定义包含类FragMentPageC的填充内容的布局文件fragment_c.xml:
[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical"  
  6.     android:background="#ff000fff">  
  7.   
  8.     <TextView  
  9.         android:id="@+id/text_b"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:text="this is fragment C"  
  13.         android:layout_gravity="center"  
  14.         android:text="30dp"/>  
  15.   
  16. </LinearLayout>  

定义包含主页面布局文件main.xml:
[java] view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="horizontal" >  
  6.     <fragment class="com.example.fragment.FragMentPageA"  
  7.         android:layout_width="wrap_content"  
  8.         android:layout_height="fill_parent"  
  9.         android:layout_weight="1"/>  
  10.     <LinearLayout android:id="@+id/layout_two"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="fill_parent"  
  13.         android:orientation="vertical"  
  14.         android:layout_weight="1"/>   
  15.   
  16. </LinearLayout>  

类FragMentPageA的定义

[java] view plain copy
  1. import android.os.Bundle;  
  2. import android.support.v4.app.Fragment;  
  3. import android.view.LayoutInflater;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6.   
  7. /** 
  8.  * @author memegood11 
  9.  * 
  10.  */  
  11. public class FragMentPageA extends Fragment {  
  12.     @Override  
  13.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  14.             Bundle savedInstanceState) {  
  15.         return inflater.inflate(R.layout.fragment_a, container, false);  
  16.     }  
  17. }  
类FragMentPageB的定义
[java] view plain copy
  1. import android.os.Bundle;  
  2. import android.support.v4.app.Fragment;  
  3. import android.view.LayoutInflater;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6.   
  7. /** 
  8.  * @author memegood11 
  9.  * 
  10.  */  
  11. public class FragMentPageB extends Fragment {  
  12.     @Override  
  13.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  14.             Bundle savedInstanceState) {  
  15.         return inflater.inflate(R.layout.fragment_b, container, false);  
  16.     }  
  17. }  

类FragMentPageC的定义
[java] view plain copy
  1. import android.os.Bundle;  
  2. import android.support.v4.app.Fragment;  
  3. import android.view.LayoutInflater;  
  4. import android.view.View;  
  5. import android.view.ViewGroup;  
  6.   
  7. /** 
  8.  * @author memegood11 
  9.  * 
  10.  */  
  11. public class FragMentPageC extends Fragment {  
  12.   
  13.     @Override  
  14.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
  15.             Bundle savedInstanceState) {  
  16.         return inflater.inflate(R.layout.fragment_c, container, false);  
  17.     }  
  18.       
  19. }  

主页面Activity的定义:

[java] view plain copy
  1. package com.example.fragment;  
  2. import android.os.Bundle;  
  3. import android.support.v4.app.FragmentActivity;  
  4. import android.support.v4.app.FragmentManager;  
  5. import android.support.v4.app.FragmentTransaction;  
  6. import android.view.View;  
  7. import android.view.View.OnClickListener;  
  8.   
  9. /** 
  10.  * @author memegood11 
  11.  * 
  12.  */  
  13. public class MainActivity extends FragmentActivity {  
  14.     FragMentPageB fragmentB;  
  15.     FragMentPageC fragmentC;  
  16.     FragmentManager fragmentMgr;  
  17.     boolean isPageC = false;  
  18.     @Override  
  19.     protected void onCreate(Bundle arg0) {  
  20.         super.onCreate(arg0);  
  21.         setContentView(R.layout.main);  
  22.         fragmentMgr = getSupportFragmentManager();  
  23.         fragmentB = new FragMentPageB();  
  24.         fragmentC = new FragMentPageC();  
  25.         FragmentTransaction ft = fragmentMgr.beginTransaction();  
  26.         ft.add(R.id.layout_two, fragmentB);  
  27.         ft.add(R.id.layout_two, fragmentC);  
  28.         ft.commit();          
  29.     }  
  30.   
  31.     @Override  
  32.     protected void onDestroy() {  
  33.   
  34.         super.onDestroy();  
  35.     }  
  36.   
  37.     @Override  
  38.     protected void onStart() {  
  39.         super.onStart();  
  40.         findViewById(R.id.btn).setOnClickListener(new OnClickListener() {  
  41.               
  42.             @Override  
  43.             public void onClick(View v) {  
  44.                 FragmentTransaction ft = fragmentMgr.beginTransaction();  
  45.                 if(isPageC){  
  46.                     isPageC = false;  
  47.                     ft.hide(fragmentC);  
  48.                     ft.show(fragmentB);  
  49.                       
  50.                 }else{  
  51.                     isPageC = true;  
  52.                     ft.hide(fragmentB);  
  53.                     ft.show(fragmentC);  
  54.                       
  55.                 }  
  56.                 ft.commit();  
  57.             }  
  58.         });  
  59.     }  
  60.   
  61.     @Override  
  62.     protected void onStop() {  
  63.         super.onStop();  
  64.     }  
  65. }  

fragment就介绍到这里了,有问题的同仁可以留言,我们一起讨论

from:http://blog.csdn.net/memegood123/article/details/7347283

你可能感兴趣的:(Fragment应用的介绍)