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。
public class MainTabActivity extends Activity { private TabHost mHost; // 在Activity中使用Tabhost必須要有LocalActivityManager物件來設定 LocalActivityManager lam; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // main layout採用預設的Tabhost mHost = (TabHost) findViewById(android.R.id.tabhost); lam = new LocalActivityManager(MainTabActivity.this, false); lam.dispatchCreate(savedInstanceState); mHost.setup(lam); mHost.addTab(mHost.newTabSpec("Tab1").setIndicator("Tab1").setContent(new Intent(MainTabActivity.this, FragmentActivity1.class))); mHost.addTab(mHost.newTabSpec("Tab2").setIndicator("Tab2").setContent(new Intent(MainTabActivity.this, FragmentActivity2.class))); } @Override protected void onPause() { // 漏掉這行一定出錯 lam.dispatchPause(isFinishing()); super.onPause(); } @Override protected void onResume() { // 漏掉這行一定出錯 lam.dispatchResume(); super.onResume(); } }
FragmentActivity1.java : 第一個Tab中用來管理Fragment的FragmentActivity。(2012-05-07更新)經由Jay留言後,小蛙詳細測了一下,發現FragmentActivity主畫麵中的Button是沒辦法消失的(因為FragmentActivity的目的關係),因此改成這樣,讓FragmentActivity純粹當成容器,主要的內容還是以Fragment為主。(這個方法不是唯一,但是一個可行的方法,應該也有更好的做法!)
public class FragmentActivity1 extends FragmentActivity { public static FragmentManager fm; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_activity_1); fm = getSupportFragmentManager(); // 隻當容器,主要內容已Fragment呈現 initFragment(new Fragment1()); } // 切換Fragment public static void changeFragment(Fragment f){ changeFragment(f, false); } // 初始化Fragment(FragmentActivity中唿叫) public static void initFragment(Fragment f){ changeFragment(f, true); } private static void changeFragment(Fragment f, boolean init){ FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.simple_fragment, f); if(!init) ft.addToBackStack(null); ft.commit(); } }
Fragment1.java : 真正使用到的Fragment。
public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_1, container, false); Button tv = (Button)v.findViewById(R.id.button2); tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 直接唿叫FragmentActivity1的靜態方法來做切換 FragmentActivity1.changeFragment(new Fragment2()); } }); return v; } }
fragment_acitivity_1.xml : FragmentActivity layout。(2012-05-07修改) FragmentActivity隻用來當容器,而不真正呈現內容(僅把Fragment內容載入)。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:> </LinearLayout>
fragment1.xml:Fragment layout,FragmentActivity載入的真正內容。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <Button android: android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> </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
最後更新:2017-04-02 16:47:42
上一篇:
Java:使用內部類實現類的多重繼承
下一篇:
JavaMail學習筆記(二)、JavaMail API簡介和配置開發環境
C# WinForm多線程開發(三) Control.Invoke
acid
全國僅四家!阿裏雲ET城市大腦入選國家AI開放創新平台
安卓老大:三星占46%的安卓市場份額
springmvc4 mybatis 整合 框架源碼 bootstrap html5 mysql oracle sqlsever spring SSM
Java之dead code——無用代碼
《vSphere性能設計:性能密集場景下CPU、內存、存儲及網絡的最佳設計實踐》一2.1.3 使用容量規劃工具
Java學習路線圖,專為新手定製的學習計劃建議
首款基於 DynamIQ 的高性能 嵌入式處理器Cortex-A75
怎樣做好一個產品之用戶體驗