1.什麼狀況下使用?android
fragment一般用來做爲一個activity的用戶界面的一部分ide
例如,一個新聞應用能夠在屏幕左側使用一個fragment來展現一個文章的列表,而後在屏幕右側使用另外一個fragment來展現一篇文章 – 2個fragment並排顯示在相同的一個activity中,而且每個fragment擁有它本身的一套生命週期回調方法,而且處理它們本身的用戶輸 入事件. 所以, 取代使用一個activity來選擇一篇文章,而另外一個activity來閱讀文章 的方式,用戶能夠在相同的activity中選擇一篇文章而且閱讀。http://my.oschina.net/u/573470/blog/73333(原文出處)函數
建立Fragment佈局
要建立一個fragment, 必須建立一個 Fragment 的子類 (或者繼承自一個已存在的它的子類). Fragment類的代碼看起來很像 Activity .它包含了和activity相似的回調方法, 例如 onCreate(), onStart(),onPause, 以及 onStop(). 事實上, 若是你準備將一個現成的Android應用轉換到使用fragment,你可能只需簡單的將代碼從你的activity的回調函數分別移動到你的fragment的回調方法.
一般, 應當至少實現以下的生命週期方法:this
onCreate()spa
當建立fragment時, 系統調用此方法.
在實現代碼中,應當初始化想要在fragment中保持的必要組件, 當fragment被暫停或者中止後能夠恢復..net
onCreateView()code
fragment第一次繪製它的用戶界面的時候, 系統會調用此方法. 爲了繪製fragment的UI,此方法必須返回一個View, 這個view是你的fragment佈局的根view. 若是fragment不提供UI, 能夠返回null.xml
onPause()對象
用戶將要離開fragment時,系統調用這個方法做爲第一個指示(然而它不老是意味着fragment將被銷燬.) 在當前用戶會話結束以前,一般應當在這裏提交任何應該持久化的變化(由於用戶有可能不會返回).
除了繼承基類 Fragment , 還有一些子類你可能會繼承:
1.DialogFragment:顯示一個浮動的對話框.
由於你能夠將一個fragment對話框合併到activity管理的fragment back stack中,容許用戶返回到一個以前曾被摒棄的fragment.
2.ListFragment
顯示一個由一個adapter(例如 SimpleCursorAdapter)管理的項目的列表, 相似於ListActivity.
它提供一些方法來管理一個list view, 例如 onListItemClick()回調來處理點擊事件.
3.PreferenceFragment
顯示一個 Preference對象的層次結構的列表, 相似於PreferenceActivity.
這在爲你的應用建立一個"設置"activity時有用處.
fragment一般用來做爲一個activity的用戶界面的一部分,並將它的layout提供給activity.爲了給一個fragment提供一個layout,你必須實現 onCreateView()回調方法, 當到了fragment繪製它本身的layout的時候,Android系統調用它.你的此方法的實現代碼必須返回一個你的fragment的layout的根view. 注意 : 若是你的fragment是ListFragment的子類,它的默認實現是返回從onCreateView()返回一個ListView,因此通常狀況下沒必要實現它.
public static class ExampleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.example_fragment, container, false); } }
傳入 onCreateView() 的 container 參數是你的fragmentlayout將被插入的父ViewGroup(來自activity的layout).savedInstanceState 參數是一個Bundle, 若是fragment是被恢復的,它提供關於fragment的以前的實例的數據
將fragment添加到activity
一般地, fragment爲宿主activity提供UI的一部分, 被做爲activity的整個viewhierarchy的一部分被嵌入. 有2種方法你能夠添加一個fragment到activitylayout:
在activity的layout文件中聲明fragment
你能夠像爲View同樣, 爲fragment指定layout屬性.
例子是一個有2個fragment的activity:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="com.example.news.ArticleListFragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.news.ArticleReaderFragment" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>
<fragment> 中的 android:name屬性指定了在layout中實例化的Fragment類.
當系統建立這個activity layout時,它實例化每個在layout中指定的fragment,並調用每個上的onCreateView()方法,來獲取每個 fragment的layout.系統將從fragment返回的 View直接插入到<fragment>元素所在的地方.
注意:每個fragment都須要一個惟一的標識,若是activity重啓,系統能夠用來恢復fragment(而且你也能夠用來捕獲fragment來處理事務,例如移除它.)
有3種方法來爲一個fragment提供一個標識:
撰寫代碼將fragment添加到一個已存在的ViewGroup.
當activity運行的任什麼時候候, 均可以將fragment添加到activitylayout.只需簡單的指定一個須要放置fragment的ViewGroup.爲了在你的 activity中操做fragment事務(例如添加,移除,或代替一個fragment),必須使用來自FragmentTransaction 的API.
能夠按以下方法,從你的Activity取得一個 FragmentTransaction 的實例:
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
而後你可使用 add() 方法添加一個fragment, 指定要添加的fragment, 和要插入的view.
ExampleFragment fragment = new ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit();
add()的第一個參數是fragment要放入的ViewGroup, 由resource ID指定,第二個參數是須要添加的fragment.一旦用FragmentTransaction作了改變,爲了使改變生效,必須調用commit().
管理Fragment
要在activity中管理fragment,須要使用FragmentManager. 經過調用activity的getFragmentManager()取得它的實例.
能夠經過FragmentManager作一些事情, 包括:
處理Fragment事務
關於在activity中使用fragment的很強的一個特性是:根據用戶的交互狀況,對fragment進行添加,移除,替換,以及執行其餘動做.提交給activity的每一套變化被稱爲一個事務,可使用在 FragmentTransaction 中的 API 處理.咱們也能夠保存每個事務到一個activity管理的backstack,容許用戶經由fragment的變化往回導航(相似於經過activity日後導航).
從 FragmentManager 得到一個FragmentTransaction的實例 :
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每個事務都是同時要執行的一套變化.能夠在一個給定的事務中設置你想執行的全部變化,使用諸如 add(), remove(),和 replace().而後, 要給activity應用事務, 必須調用 commit().
在調用commit()以前, 你可能想調用 addToBackStack(),將事務添加到一個fragment事務的backstack. 這個back stack由activity管理, 並容許用戶經過按下 BACK按鍵返回到前一個fragment狀態.
舉個例子, 這裏是如何將一個fragment替換爲另外一個, 並在後臺堆棧中保留以前的狀態:
// Create new fragment and transaction Fragment newFragment = new ExampleFragment(); FragmentTransaction transaction = getFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit();
在這個例子中, newFragment替換了當前layout容器中的由R.id.fragment_container標識的fragment.經過調用 addToBackStack(), replace事務被保存到back stack,所以用戶能夠回退事務,並經過按下BACK按鍵帶回前一個fragment.
若是添加多個變化到事務(例如add()或remove())並調用addToBackStack(),而後在你調用commit()以前的全部應用的變化會被做爲一個單個事務添加到後臺堆棧, BACK按鍵會將它們一塊兒回退.