【Android基礎入門No.2】AndroidのFragment

  • 其中大多數程序必須使用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.     <!-- 使用fragment標籤,android:name=””指定一個添加到xml中的Fragment --> 
  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.     } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章