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

來源:互聯網
上載者:User

Android官方已經提供了Fragment的各種使用的Demo例子,在我們SDK下面的API Demo裡面就包含了Fragment的各種使用例子,需要看Demo的朋友,直接看API Demo那個程式就可以了,不用到處去找。裡面分開不同功能,實現了不同的類 

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

1、管理Fragment
要在activity中管理fragment,需要使用FragmentManager. 通過調用activity的getFragmentManager()取得它的執行個體.

•可以通過FragmentManager做一些事情, 包括: 使用findFragmentById()(用於在activity layout中提供一個UI的fragment)或findFragmentByTag()(適用於有或沒有UI的fragment)擷取 activity中存在的fragment。
•將fragment從後台堆棧中彈出, 使用 popBackStack() (類比使用者按下BACK 命令)。
•使用addOnBackStackChangeListener()註冊一個監聽後台堆棧變化的listener。

2、處理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 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中顯示的順序

當執行一個移除fragment的事務時, 如果沒有調用 addToBackStack(), 那麼當事務提交後,那個fragment會被銷毀,並且使用者不能導航回到它。有鑒於此,當移除一個fragment時,如果調用了 addToBackStack(), 那麼fragment會被停止,如果使用者導航回來,它將會被恢複。另外,對於每一個fragment事務,你可以應用一個事務動畫,通過在提交事務之前調 用setTransition()實現。

調用 commit() 並不立即執行事務。恰恰相反,它將事務安排排期, 一旦準備好,就在activity的UI線程上運行(主線程)。如果有必要, 無論如何,你可以從你的UI線程調用executePendingTransactions()來立即執行由commit()提交的事務。但這麼做通常不 必要,除非事務是其他線程中的任務的一個從屬。
警告:你只能在activity儲存它的狀態(當使用者離開activity)之前使用commit()提交事務.
 
3、與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);


4、總結
最 後需要說一下Fragment的例子,Android官方已經提供了Fragment的各種使用的Demo例子,在我們SDK下面的API Demo裡面就包含了Fragment的各種使用例子,需要看Demo的朋友,直接看API Demo那個程式就可以了,不用到處去找。裡面分開不同功能,實現了不同的類。可以根據需要查看具體代碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.