Android基礎之使用Fragment控制切換多個頁面

Android官方已經提供了Fragment的各類使用的Demo例子,在咱們SDK下面的API Demo裏面就包含了Fragment的各類使用例子,須要看Demo的朋友,直接看API Demo那個程序就能夠了,不用處處去找。裏面分開不一樣功能,實現了不一樣的類

今天講解一下Fragment的控制,主要是切換View和頁面替換等操做。還有就是如何獲取Fragment的管理對象,以及與Activity的通訊方式。

一、管理Fragment
要在activity中管理fragment,須要使用FragmentManager. 經過調用activity的getFragmentManager()取得它的實例.android

•能夠經過FragmentManager作一些事情, 包括: 使用findFragmentById()(用於在activity layout中提供一個UI的fragment)或findFragmentByTag()(適用於有或沒有UI的fragment)獲取activity中存在的fragment。
•將fragment從後臺堆棧中彈出, 使用 popBackStack() (模擬用戶按下BACK 命令)。
•使用addOnBackStackChangeListener()註冊一個監聽後臺堆棧變化的listener。動畫

二、處理Fragment事務
關於在activity中使用fragment的很強的一個特性是:根據用戶的交互狀況,對fragment進行添加、移除、替換以及執行其餘動做。提交給activity的每一套變化被稱爲一個事務,可使用在FragmentTransaction中的 API 處理。咱們也能夠保存每個事務到一個activity管理的backstack,容許用戶經由fragment的變化往回導航(相似於經過 activity日後導航)。this

從 FragmentManager 得到一個FragmentTransaction實例:spa

複製代碼 代碼以下:

FragmentManager fragmentManager =getFragmentManager();
FragmentTransaction fragmentTransaction =fragmentManager.beginTransaction();

每個事務都是同時要執行的一套變化。能夠在一個給定的事務中設置你想執行的全部變化,使用諸如 add()、remove()和 replace()。而後, 要給activity應用事務,必須調用 commit()。

 

在調用commit()以前,你可能想調用 addToBackStack(),將事務添加到一個fragment事務的backstack。這個back stack由activity管理, 並容許用戶經過按下 BACK按鍵返回到前一個fragment狀態。.net

複製代碼 代碼以下:

//建立修改實例
Fragment newFragment = newExampleFragment();
FragmentTransaction transaction =getFragmentManager().beginTransaction();
// Replace whatever is in thefragment_container view with this fragment,
// and add the transaction to the backstack
transaction.replace(R.id.fragment_container,newFragment);
transaction.addToBackStack(null);
//提交修改
transaction.commit();

上面是如何將一個fragment替換爲另外一個,並在後臺堆棧中保留以前的狀態。在這個例子中,newFragment替換了當前layout容器中的由R.id.fragment_container標識的fragment。經過調用 addToBackStack(), replace事務被保存到back stack,所以用戶能夠回退事務,並經過按下BACK按鍵帶回前一個fragment。

 

若是添加多個變化到事務(例如add()或remove())並調用addToBackStack(),而後在你調用commit()以前的全部應用的變化會被做爲一個單個事務添加到後臺堆棧,BACK按鍵會將它們一塊兒回退。添加變化到 FragmentTransaction的順序不重要, 除如下例外: 線程

•必須最後調用 commit()
•若是添加多個fragment到同一個容器, 那麼添加的順序決定了它們在view hierarchy中顯示的順序code

當執行一個移除fragment的事務時, 若是沒有調用 addToBackStack(), 那麼當事務提交後,那個fragment會被銷燬,而且用戶不能導航回到它。有鑑於此,當移除一個fragment時,若是調用了addToBackStack(), 那麼fragment會被中止,若是用戶導航回來,它將會被恢復。另外,對於每個fragment事務,你能夠應用一個事務動畫,經過在提交事務以前調用setTransition()實現。htm

調用 commit() 並不當即執行事務。偏偏相反,它將事務安排排期, 一旦準備好,就在activity的UI線程上運行(主線程)。若是有必要, 不管如何,你能夠從你的UI線程調用executePendingTransactions()來當即執行由commit()提交的事務。但這麼作一般沒必要要,除非事務是其餘線程中的任務的一個從屬。
警告:你只能在activity保存它的狀態(當用戶離開activity)以前使用commit()提交事務.
 
三、與Activity通訊
儘管Fragment被實現爲一個獨立於Activity的對象,而且能夠在多個activity中使用,但一個給定的fragment實例是直接綁定到包含它的activity的。 特別的fragment可使用 getActivity() 訪問Activity實例, 而且容易地執行好比在activity layout中查找一個view的任務。以下面的代碼:對象

複製代碼 代碼以下:

View listView =getActivity().findViewById(R.id.list);

一樣地,activity能夠經過從FragmentManager得到一個到Fragment的引用來調用fragment中的方法,使用findFragmentById() 或 findFragmentByTag()。
複製代碼 代碼以下:

ExampleFragment fragment =(ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);

四、總結
最後須要說一下Fragment的例子,Android官方已經提供了Fragment的各類使用的Demo例子,在咱們SDK下面的API Demo裏面就包含了Fragment的各類使用例子,須要看Demo的朋友,直接看API Demo那個程序就能夠了,不用處處去找。裏面分開不一樣功能,實現了不一樣的類。能夠根據須要查看具體代碼。

 

相關文章
相關標籤/搜索