閱讀郭林《第一行代碼》的筆記——第4章 手機平板要兼顧,探究碎片

1、碎片是什麼,碎片的使用方式碎片是什麼

碎片(Fragment)是一種可以嵌入在活動當中的UI片段,它能讓程序更加合理和充分地利用大屏幕的空間,因而在平板上應用的非常廣泛。雖然碎片對你來說應該是個全新的概念,但我相信你學習起來應該毫不費力,因爲它和活動實在是太像了,同樣都能包含佈局,同樣都有自己的生命週期。你甚至可以將碎片理解成一個迷你型的活動,雖然這個迷你型的活動有可能和普通的活動是一樣大的。

動態添加碎片

碎片真正的強大之處在於,它可以在程序運行時動態地添加到活動當中。根據具體情況來動態地添加碎片,你就可以將程序界面定製得更加多樣化。
動態添加碎片主要分爲5步。
1.創建待添加的碎片實例。
2.獲取到FragmentManager,在活動中可以直接調用getFragmentManager()方法得到。
3.開啓一個事務,通過調用beginTransaction()方法開啓。
4.向容器內加入碎片,一般使用replace()方法實現,需要傳入容器的id和待添加的碎片實例。
提交事務,調用commit()方法來完成。
例子:

   AnotherRightFragment fragment = new AnotherRightFragment();
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction transaction = fragmentManager. beginTransaction();
            transaction.replace(R.id.right_layout, fragment);
            transaction.commit();

在碎片中模擬返回棧

通過點擊按鈕添加了一個碎片之後,這時按下Back鍵程序就會直接退出。如果這裏我們想模仿類似於返回棧的效果,按下Back鍵可以回到上一個碎片,該如何實現呢?其實很簡單,FragmentTransaction中提供了一個addToBackStack()方法,可以用於將一個事務添加到返回棧中,修改MainActivity中的代碼,如下所示:

 AnotherRightFragment fragment = new AnotherRightFragment();
            FragmentManager fragmentManager = getFragmentManager();
            FragmentTransaction transaction = fragmentManager. beginTransaction();
            transaction.replace(R.id.right_layout, fragment);
            transaction.addToBackStack(null);//在事務提交之前調用了FragmentTransaction的 addToBackStack()方法,它可以接收一個名字用於描述返回棧的狀態,一般傳入null即可。
            transaction.commit();

碎片和活動之間進行通信

(1)碎片與活動之間的通信:
爲了方便碎片和活動之間進行通信,FragmentManager提供了一個類似於findViewById()的方法,專門用於從佈局文件中獲取碎片的實例,代碼如下所示:RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);
調用FragmentManager的findFragmentById()方法,可以在活動中得到相應碎片的實例,然後就能輕鬆地調用碎片裏的方法了。
掌握瞭如何在活動中調用碎片裏的方法,那在碎片中又該怎樣調用活動裏的方法呢?其實這就更簡單了,在每個碎片中都可以通過調用getActivity()方法來得到和當前碎片相關聯的活動實例,代碼如下所示:MainActivity activity = (MainActivity) getActivity();
有了活動實例之後,在碎片中調用活動裏的方法就變得輕而易舉了。另外當碎片中需要使用Context對象時,也可以使用getActivity()方法,因爲獲取到的活動本身就是一個Context對象了。
(2)碎片與碎片之間的通信:
這裏寫圖片描述

2、碎片的生命週期

碎片的狀態和回調

每個活動在其生命週期內一共有運行狀態、暫停狀態、停止狀態和銷燬狀態這四種。類似地,每個碎片在其生命週期內也可能會經歷這幾種狀態,只不過在一些細小的地方會有部分區別。
1.運行狀態 : 當一個碎片是可見的,並且它所關聯的活動正處於運行狀態時,該碎片也處於運行狀態。
2.暫停狀態 :當一個活動進入暫停狀態時(由於另一個未佔滿屏幕的活動被添加到了棧頂),與它相關聯的可見碎片就會進入到暫停狀態。
3.停止狀態 : 當一個活動進入停止狀態時,與它相關聯的碎片就會進入到停止狀態。或者通過調用FragmentTransaction的remove()、replace()方法將碎片從活動中移除,但有在事務提交之前調用addToBackStack()方法,這時的碎片也會進入到停止狀態。總的來說,進入停止狀態的碎片對用戶來說是完全不可見的,有可能會被系統回收。
4.銷燬狀態 : 碎片總是依附於活動而存在的,因此當活動被銷燬時,與它相關聯的碎片就會進入到銷燬狀態。或者通過調用FragmentTransaction的remove()、replace()方法將碎片從活動中移除,但在事務提交之前並沒有調用addToBackStack()方法,這時的碎片也會進入到銷燬狀態。

Fragment類中也提供了一系列的回調方法,以覆蓋碎片生命週期的每個環節。其中,活動中有的回調方法,碎片中幾乎都有,不過碎片還提供了一些附加的回調方法,那我們就重點來看下這幾個回調。
1.onAttach() :當碎片和活動建立關聯的時候調用。
2.onCreateView() :爲碎片創建視圖(加載佈局)時調用。
3.onActivityCreated() :確保與碎片相關聯的活動一定已經創建完畢的時候調用。
4.onDestroyView() :當與碎片關聯的視圖被移除的時候調用。
5.onDetach() :當碎片和活動解除關聯的時候調用。
碎片完整的生命週期示意圖可參考圖4.8,圖片源自Android官網。

體驗碎片的生命週期

——見書4.3.2節——
另外值得一提的是,在碎片中你也是可以通過onSaveInstanceState()方法來保存數據的,因爲進入停止狀態的碎片有可能在系統內存不足的時候被回收。保存下來的數據在onCreate()、onCreateView()和onActivityCreated()這三個方法中你都可以重新得到,它們都含有一個Bundle類型的savedInstanceState參數。具體的代碼我就不在這裏給出了,如果你忘記了該如何編寫可以參考2.4.5小節。

3、動態加載佈局的技巧

使用限定符

如果你經常使用平板電腦,應該會發現很多的平板應用現在都採用的是雙頁模式(程序會在左側的面板上顯示一個包含子項的列表,在右側的面板上顯示內容),因爲平板電腦的屏幕足夠大,完全可以同時顯示下兩頁的內容,但手機的屏幕一次就只能顯示一頁的內容,因此兩個頁面需要分開顯示。
那麼怎樣才能在運行時判斷程序應該是使用雙頁模式還是單頁模式呢?這就需要藉助限定符(Qualifiers)來實現了。
Android中一些常見的限定符可以參考下表。
這裏寫圖片描述

使用最小寬度限定符

最小寬度限定符允許我們對屏幕的寬度指定一個最小指(以dp爲單位),然後以這個最小值爲臨界點,屏幕寬度大於這個值的設備就加載一個佈局,屏幕寬度小於這個值的設備就加載另一個佈局。
需要注意一點,最小寬度限定符是在Android 3.2版本引入的。

發佈了259 篇原創文章 · 獲贊 47 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章