1. 什麼是Fragmentjava
Fragment是Android honeycomb 3.0新增的概念,Fragment名爲碎片不過卻和Activity十分類似。Fragment是用來描述一些行爲或一部分用戶界面在一個Activity中,android
(1)你能夠合併多個fragment在一個單獨的activity中創建多個UI面板,ide
(2)同時重用fragment在多個activity中。佈局
你能夠認爲fragment做爲一個activity中的一節模塊 ,fragment有本身的生命週期,接收本身的輸入事件,你能夠添加或移除從運行中的activity。xml
從中能夠看出:一個fragment必須老是嵌入在一個activity中,同時fragment的生命週期 受 activity而影響。當activity 暫停,那麼全部在這個activity的fragments將被destroy釋放。blog
2. Fragment的生命週期生命週期
當fragment和activity被關聯時調用。事件
當fragment建立時被調用,你應該初始化一些實用的組件,好比在fragment暫停或中止時須要恢復的utf-8
當系統調用fragment在首次繪製用戶界面時,若是畫一個UI在你的fragment你必須返回一個View固然了你能夠返回null表明這個fragment沒有UI.rem
public static class AndroidFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.android_fragment, container, false); } }
當activity的onCreate()方法返回時調用。
在running狀態下的可見狀態。
另外一個activity在前景運行,而且享有焦點,可是這個fragment所在的activity仍然可見(前景activity部分遮擋或者是半透明的)。
fragment不可見。多是由於宿主activity處於stopped狀態,或者fragment被remove掉,而後加在了back stack中。
一個處於stopped狀態的activity仍是存活狀態的,全部的狀態和成員信息會被系統保持。可是,它再也不被用戶可見,而且若是宿主activity被kill掉,它也會被kill掉。
當fragment的UI被移除的時候調用。
當fragment和activity去關聯時調用。
3. 建立Fragment
3.1 靜態建立
3.1.1 activity_main.xml,在一個xml文件中建立了兩個fragment
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <fragment android:id="@+id/fragment1" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.egos.fragmentsample.Fragment1" /> <fragment android:id="@+id/fragment2" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:name="com.egos.fragmentsample.Fragment2" /> </LinearLayout>
3.1.2 分別建立兩個Fragment
//Fragment1.java public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.fragment1, container, false); } }
//Fragment2.java public class Fragment2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.fragment1, container, false); } }
3.1.3 建立main.activity
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.activity_main); } }
3.2 動態建立
3.2.1 建立Fragment佈局
//Fragment_dynamic.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is a fragment" /> </LinearLayout>
3.2.2 建立DynamicFragment.java
public class DynamicFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub return inflater.inflate(R.layout.fragment_dynamic, container, false); } }
3.2.3 建立main Activity佈局
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"/> </LinearLayout>
3.2.4 建立MainActivity.java
public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle arg0) { super.onCreate(arg0); setContentView(R.layout.activity_main2); if (arg0 == null) { getSupportFragmentManager().beginTransaction().add(R.id.container, new DynamicFragment()).commit(); } } }
4. Fragment與Activity
4.1 fragment顯得更加靈活。能夠直接在XML文件中添加<fragment/>,Activity則不能。
4.2 能夠在一個界面上靈活的替換一部分頁面,activity不能夠,作不到。
4.3 fragment和Activity之間的通訊:(也就是控件的相互操控)
View listView = getActivity().findViewById(R.id.list);PS:在當前activity和fragment已經進行關聯的狀況下不然返回null。
xxxFragment xxx=getFragmentManager().findFragmentById();
4.4 fragment和Activity中控件的加載
Fragment的載入是經過OnCreateView的時候經過inflater.inflate()加載佈局,而後經過修改main.xml,在main.xml上增長註冊fragment標籤,而後經過android:name來載入你已經經過inflater加載的隱藏佈局。有幾個關鍵點:fragment是經過inflater加載View而後在main.xml中註冊獲得的。固然若是你能夠在fragment中獲得View那就能夠經過View.findViewId()來操控fragment上的具體控件。