Fragment 和 FragmentActivity

認識:首先我們知道Fragment是我們在單個Activity上要切換多個UI界面,顯示不同內容。模塊化這些UI面板以便提供給其他Acitivity使用便利。同時我們顯示的Fragment也會受到當前的這個Acitivity生命週期影響。(而平常的Fragment有其自己的生命週期)

一、使用方法:


1、創建一個或者多個你需要的Fragment類,其實就是類似activity一樣,也有OnCreate()等回調函數。


2、如果要讓當前的程序也就是Activity使用Fragment的話,需要把Acitivity中相關的回調函數內容搬過去。you might simply move code from your activity's callback methods into the respective callback methods of your fragment

一般地,我們需要以下回調函數:

onCreate()
onCreateView()
onPause()

除了以上3個我們基本上都要用到的回調函數方法,那麼我們寫得Fragment中還有其他: Handling the Fragment Lifecycle

二、關於繼承Fragment類


除了基本的Fragment類,我們還可以繼承的有:

DialogFragment
ListFragment
PreferenceFragment

三、添加用戶界面


我們再 onCreateView() 裏面處理我們的Fragment要顯示的界面,返回的是一個View,這個View其實就是我們定義這個Fragment的Layout的root項(最外的、最大的那個哦!)。


從XML佈局中生成View我們用LayoutInflater這個助手類提供的方法。



文解決我這兩天的問題,故轉載:原文Android Tabhost with FragmentActivity

 

2012-05-07 更新)接續Android TabHost中切換Activity記錄了使用ActivityGroup達到在TabHost中切換Activity的方法,也在Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle記錄了當螢幕方向改變時的處理,這篇小蛙繼續記錄用FragmentActivity取代ActivityGroup,透過FragmentActivity內建的BackStack來管理倒退歷程。

MainTabActivity.java : 主要的Tabhost Activity。

[java] view plaincopy
  1. public class MainTabActivity extends Activity {  
  2.     private TabHost mHost;  
  3.     // 在Activity中使用Tabhost必須要有LocalActivityManager物件來設定  
  4.     LocalActivityManager lam;  
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.         // main layout採用預設的Tabhost  
  10.         mHost = (TabHost) findViewById(android.R.id.tabhost);  
  11.    
  12.         lam = new LocalActivityManager(MainTabActivity.thisfalse);  
  13.         lam.dispatchCreate(savedInstanceState);  
  14.    
  15.         mHost.setup(lam);  
  16.         mHost.addTab(mHost.newTabSpec("Tab1").setIndicator("Tab1").setContent(new Intent(MainTabActivity.this, FragmentActivity1.class)));  
  17.         mHost.addTab(mHost.newTabSpec("Tab2").setIndicator("Tab2").setContent(new Intent(MainTabActivity.this, FragmentActivity2.class)));  
  18.     }  
  19.     @Override  
  20.     protected void onPause() {  
  21.         // 漏掉這行一定出錯  
  22.         lam.dispatchPause(isFinishing());  
  23.         super.onPause();  
  24.     }  
  25.     @Override  
  26.     protected void onResume() {  
  27.         // 漏掉這行一定出錯  
  28.         lam.dispatchResume();  
  29.         super.onResume();  
  30.     }  
  31. }  

FragmentActivity1.java : 第一個Tab中用來管理Fragment的FragmentActivity。(2012-05-07更新)經由Jay留言後,小蛙詳細測了一下,發現FragmentActivity主畫面中的Button是沒辦法消失的(因為FragmentActivity的目的關係),因此改成這樣,讓FragmentActivity純粹當成容器,主要的內容還是以Fragment為主。(這個方法不是唯一,但是一個可行的方法,應該也有更好的做法!)

[java] view plaincopy
  1. public class FragmentActivity1 extends FragmentActivity {  
  2.     public static FragmentManager fm;  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.fragment_activity_1);  
  7.         fm = getSupportFragmentManager();  
  8.         // 只當容器,主要內容已Fragment呈現  
  9.         initFragment(new Fragment1());  
  10.     }  
  11.     // 切換Fragment  
  12.     public static void changeFragment(Fragment f){  
  13.         changeFragment(f, false);  
  14.     }  
  15.     // 初始化Fragment(FragmentActivity中呼叫)  
  16.     public static void initFragment(Fragment f){  
  17.         changeFragment(f, true);  
  18.     }  
  19.     private static void changeFragment(Fragment f, boolean init){  
  20.         FragmentTransaction ft = fm.beginTransaction();  
  21.         ft.replace(R.id.simple_fragment, f);  
  22.         if(!init)  
  23.             ft.addToBackStack(null);  
  24.         ft.commit();  
  25.     }  
  26. }  

Fragment1.java : 真正使用到的Fragment。

[java] view plaincopy
  1. public class Fragment1 extends Fragment {  
  2.     @Override  
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  4.         View v = inflater.inflate(R.layout.fragment_1, container, false);  
  5.         Button tv = (Button)v.findViewById(R.id.button2);  
  6.         tv.setOnClickListener(new View.OnClickListener() {  
  7.             @Override  
  8.             public void onClick(View v) {  
  9.                 // 直接呼叫FragmentActivity1的靜態方法來做切換  
  10.                 FragmentActivity1.changeFragment(new Fragment2());  
  11.             }  
  12.         });  
  13.         return v;  
  14.     }  
  15. }  

fragment_acitivity_1.xml : FragmentActivity layout。(2012-05-07修改) FragmentActivity只用來當容器,而不真正呈現內容(僅把Fragment內容載入)。

[html] view plaincopy
  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:id="@+id/simple_fragment">  
  7. </LinearLayout>  

fragment1.xml:Fragment layout,FragmentActivity載入的真正內容。

[html] view plaincopy
  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.     <Button  
  7.         android:id="@+id/button2"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="Button" />  
  11. </LinearLayout>  

最後別忘了在AndroidManifest.xml中加入android:configChanges="orientation"設定。這樣就成功的使用在Activity中使用Tabhost並且透過FragmentActivity來管理Fragment囉!


下面講講爲啥要用Fragment:
首先,Fragment可以兼容手機和平板,最大減少針對不同平臺的工作量。
其次,Fragment可以向下兼容(通過android官方的Support Package),在2.x平臺上沒有任何問題。
最重要的是,Fragment實質上是一種可以包含控制代碼的視圖模塊,可以非常方便的進行組合。

[另外,如果大家現在去看TabActivity的官方文檔,會發現此類已被標記爲deprecated,建議使用Fragment代替]

廢話少說,給大家展示兩個項目,都是github上面開源的。
1.水平分頁指示器,google+中有用到這種效果,現已成爲android4.0標配。
這個項目只是實現了分頁指示。谷歌的Support Package自己內置了一套水平滑動的方案,非常實用,基於Fragment實現。
 
2.給大家一個完整的使用Fragment的項目案例。
這個項目做的好像是一個電視節目提醒之類的東西,運行截圖如下:
 

下面附上這兩個開源項目的地址:
1.水平分頁指示器   https://github.com/tisa007/Android-ViewPagerIndicator/zipball/master
2.使用Fragment的項目案例  https://github.com/UweTrottmann/SeriesGuide認識:首先我們知道Fragment是我們在單個Activity上要切換多個UI界面,顯示不同內容。模塊化這些UI面板以便提供給其他Acitivity使用便利。同時我們顯示的Fragment也會受到當前的這個Acitivity生命週期影響。(而平常的Fragment有其自己的生命週期)

一、使用方法:


1、創建一個或者多個你需要的Fragment類,其實就是類似activity一樣,也有OnCreate()等回調函數。


2、如果要讓當前的程序也就是Activity使用Fragment的話,需要把Acitivity中相關的回調函數內容搬過去。you might simply move code from your activity's callback methods into the respective callback methods of your fragment

一般地,我們需要以下回調函數:

onCreate()
onCreateView()
onPause()

除了以上3個我們基本上都要用到的回調函數方法,那麼我們寫得Fragment中還有其他: Handling the Fragment Lifecycle

二、關於繼承Fragment類


除了基本的Fragment類,我們還可以繼承的有:

DialogFragment
ListFragment
PreferenceFragment

三、添加用戶界面


我們再 onCreateView() 裏面處理我們的Fragment要顯示的界面,返回的是一個View,這個View其實就是我們定義這個Fragment的Layout的root項(最外的、最大的那個哦!)。


從XML佈局中生成View我們用LayoutInflater這個助手類提供的方法。



文解決我這兩天的問題,故轉載:原文Android Tabhost with FragmentActivity

 

2012-05-07 更新)接續Android TabHost中切換Activity記錄了使用ActivityGroup達到在TabHost中切換Activity的方法,也在Android Screen Orientation Event螢幕方向處理+Acitivity Liftcycle記錄了當螢幕方向改變時的處理,這篇小蛙繼續記錄用FragmentActivity取代ActivityGroup,透過FragmentActivity內建的BackStack來管理倒退歷程。

MainTabActivity.java : 主要的Tabhost Activity。

[java] view plaincopy
  1. public class MainTabActivity extends Activity {  
  2.     private TabHost mHost;  
  3.     // 在Activity中使用Tabhost必須要有LocalActivityManager物件來設定  
  4.     LocalActivityManager lam;  
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.         // main layout採用預設的Tabhost  
  10.         mHost = (TabHost) findViewById(android.R.id.tabhost);  
  11.    
  12.         lam = new LocalActivityManager(MainTabActivity.thisfalse);  
  13.         lam.dispatchCreate(savedInstanceState);  
  14.    
  15.         mHost.setup(lam);  
  16.         mHost.addTab(mHost.newTabSpec("Tab1").setIndicator("Tab1").setContent(new Intent(MainTabActivity.this, FragmentActivity1.class)));  
  17.         mHost.addTab(mHost.newTabSpec("Tab2").setIndicator("Tab2").setContent(new Intent(MainTabActivity.this, FragmentActivity2.class)));  
  18.     }  
  19.     @Override  
  20.     protected void onPause() {  
  21.         // 漏掉這行一定出錯  
  22.         lam.dispatchPause(isFinishing());  
  23.         super.onPause();  
  24.     }  
  25.     @Override  
  26.     protected void onResume() {  
  27.         // 漏掉這行一定出錯  
  28.         lam.dispatchResume();  
  29.         super.onResume();  
  30.     }  
  31. }  

FragmentActivity1.java : 第一個Tab中用來管理Fragment的FragmentActivity。(2012-05-07更新)經由Jay留言後,小蛙詳細測了一下,發現FragmentActivity主畫面中的Button是沒辦法消失的(因為FragmentActivity的目的關係),因此改成這樣,讓FragmentActivity純粹當成容器,主要的內容還是以Fragment為主。(這個方法不是唯一,但是一個可行的方法,應該也有更好的做法!)

[java] view plaincopy
  1. public class FragmentActivity1 extends FragmentActivity {  
  2.     public static FragmentManager fm;  
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         setContentView(R.layout.fragment_activity_1);  
  7.         fm = getSupportFragmentManager();  
  8.         // 只當容器,主要內容已Fragment呈現  
  9.         initFragment(new Fragment1());  
  10.     }  
  11.     // 切換Fragment  
  12.     public static void changeFragment(Fragment f){  
  13.         changeFragment(f, false);  
  14.     }  
  15.     // 初始化Fragment(FragmentActivity中呼叫)  
  16.     public static void initFragment(Fragment f){  
  17.         changeFragment(f, true);  
  18.     }  
  19.     private static void changeFragment(Fragment f, boolean init){  
  20.         FragmentTransaction ft = fm.beginTransaction();  
  21.         ft.replace(R.id.simple_fragment, f);  
  22.         if(!init)  
  23.             ft.addToBackStack(null);  
  24.         ft.commit();  
  25.     }  
  26. }  

Fragment1.java : 真正使用到的Fragment。

[java] view plaincopy
  1. public class Fragment1 extends Fragment {  
  2.     @Override  
  3.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
  4.         View v = inflater.inflate(R.layout.fragment_1, container, false);  
  5.         Button tv = (Button)v.findViewById(R.id.button2);  
  6.         tv.setOnClickListener(new View.OnClickListener() {  
  7.             @Override  
  8.             public void onClick(View v) {  
  9.                 // 直接呼叫FragmentActivity1的靜態方法來做切換  
  10.                 FragmentActivity1.changeFragment(new Fragment2());  
  11.             }  
  12.         });  
  13.         return v;  
  14.     }  
  15. }  

fragment_acitivity_1.xml : FragmentActivity layout。(2012-05-07修改) FragmentActivity只用來當容器,而不真正呈現內容(僅把Fragment內容載入)。

[html] view plaincopy
  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:id="@+id/simple_fragment">  
  7. </LinearLayout>  

fragment1.xml:Fragment layout,FragmentActivity載入的真正內容。

[html] view plaincopy
  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.     <Button  
  7.         android:id="@+id/button2"  
  8.         android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content"  
  10.         android:text="Button" />  
  11. </LinearLayout>  

最後別忘了在AndroidManifest.xml中加入android:configChanges="orientation"設定。這樣就成功的使用在Activity中使用Tabhost並且透過FragmentActivity來管理Fragment囉!


下面講講爲啥要用Fragment:
首先,Fragment可以兼容手機和平板,最大減少針對不同平臺的工作量。
其次,Fragment可以向下兼容(通過android官方的Support Package),在2.x平臺上沒有任何問題。
最重要的是,Fragment實質上是一種可以包含控制代碼的視圖模塊,可以非常方便的進行組合。

[另外,如果大家現在去看TabActivity的官方文檔,會發現此類已被標記爲deprecated,建議使用Fragment代替]

廢話少說,給大家展示兩個項目,都是github上面開源的。
1.水平分頁指示器,google+中有用到這種效果,現已成爲android4.0標配。
這個項目只是實現了分頁指示。谷歌的Support Package自己內置了一套水平滑動的方案,非常實用,基於Fragment實現。
 
2.給大家一個完整的使用Fragment的項目案例。
這個項目做的好像是一個電視節目提醒之類的東西,運行截圖如下:
 

下面附上這兩個開源項目的地址:
1.水平分頁指示器   https://github.com/tisa007/Android-ViewPagerIndicator/zipball/master
2.使用Fragment的項目案例  https://github.com/UweTrottmann/SeriesGuide
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章