1. 程式人生 > >Android學習之基礎知識七—碎片的使用

Android學習之基礎知識七—碎片的使用

reat 大小 right www. 使用 ondestroy 方法 attach 實現

  碎片(Fragment)是一種可以嵌入在活動中的UI片斷,它能讓程序更加合理和充分地利用大屏幕的空間,它與活動相似,可以簡單的理解為一個迷你型的活動,它也有自己的生命周期。碎片在平板的應用非常廣泛。

一、碎片的簡單用法

需求:在一個活動中添加兩個碎片,並讓這兩個碎片平分活動空間。

第一步:由於碎片通常應用在平板開發中,所以先創建一個平板模擬器,然後新建一個Android項目:FragmentTest

第二步:創建左側、右側兩個碎片布局

技術分享圖片 技術分享圖片

第三步:新建一個LeftFragment類繼承Fragment.

  註意:繼承Fragment會有兩個不同包下的Fragment供你選擇,一個是系統內置的:android.app.Fragment,一個是support-v4庫中的:android.support.v4.app.Fragment. 這裏強烈建議使用support-v4庫中的Fragment,因為它可以讓碎片在所有的Android系統版本中保持功能的一致性;而系統內置的Fragment有Android系統版本的限制。另外使用support-v4庫中的Fragment,不需要在build.gradle文件中添加support-v4庫的依賴,因為build.gradle文件中已經添加了appcompat-v7庫的依賴,這個庫會將support-v4庫也一起引入進來。

技術分享圖片

第四步:同第三步,創建RightFragment,並繼承Fragment

技術分享圖片

第五步:在activity_main中通過:fragment標簽添加碎片。添加的碎片要帶上完整包名

技術分享圖片

第六步:運行程序,效果如下

技術分享圖片

二、動態添加碎片

接著上面的代碼修改:

第一步:新建一個another_right_fragment.xml

技術分享圖片

第二步:新建AnotherRightFragment類作為另外一個右側碎片

技術分享圖片

第三步:在activity_main.xml文件中,把右側改為FrameLayout布局

  FrameLayout布局是Android中最簡單的一種布局,所有的控件默認都會擺在布局的左上角,由於這裏只需要在布局中加入一個碎片,所以非常適合使用FrameLayout

技術分享圖片

第四步:在MainActivity活動中為FrameLayout布局添加內容,實現動態的添加碎片

技術分享圖片

技術分享圖片

第五步:運行程序,效果展示(左),點擊Button按鈕,效果展示(右)

技術分享圖片 技術分享圖片

總結:

動態添加碎片的步驟分為5步:

  1、創建待添加碎片的實例(new RightFragment())

  2、獲取FragmentManager,通過直接在活動中調用:getSupportFragmentManager()方法得到

  3、開啟一個事務:beginTransaction()

  4、向容器(布局)添加或替換碎片:replace()方法,傳入兩個參數:存放碎片的容器id,需要存放的碎片名稱

  5、提交事務:commit()方法

拓展:

  在上面的動態添加碎片的代碼中,我們點擊Button按鈕替換右側的碎片為:AnotherRightFragment 後,如果點擊Back鍵,就會直接退出程序,而不會返回到上一個碎片。如果我們想要通過點擊Back鍵回到上一個碎片應該怎麽做呢?

  在FragmentTransaction中有一個方法:addToBackStack()方法,用於將一個事務添加到返回棧中,它可以接收一個名字用於描述返回棧的狀態,一般傳入:null 即可。這個方法在提交事務之前調用(即調用:commit()方法之前)

技術分享圖片

三、碎片與活動之間的通信

1、在活動中創建碎片實例:FragmentManager提供了一個:findFragmentById()方法,可以在活動中得到相應碎片的實例,然後就能輕松地調用碎片裏面的方法了

  註意:獲取FragmentManager的方法有兩個:一個是系統內置的:getFragmentManager(),一個是support-v4庫中的:getSupportFragmentManager()方法,根據自己程序中引用的包來選擇。

技術分享圖片

  2、在碎片中創建活動的實例:每個碎片都可以通過:getActivity()方法來得到和當前碎片相關聯的活動實例,有了活動實例之後,在碎片中調用活動裏的方法就變得輕而易舉了。另外,當碎片中需要Context對象時,也可以使用:getActivity()方法,因為活動本身就是一個Context對象。

技術分享圖片

  3、碎片與碎片之間的通信:首先在一個碎片中得到與它關聯的活動,然後通過這個活動去獲取另外一個碎片的實例,這樣就實現了不同碎片之間的通信功能。

四、碎片的生命周期

  1、碎片運行狀態:一個碎片可見,且它所關聯的活動正處於運行狀態

  2、碎片暫停狀態:當一個活動進入暫停狀態(另一個未占滿屏幕的活動處於棧頂),與該活動關聯的可見碎片就會進入暫停狀態

  3、碎片停止狀態:當一個活動進入停止狀態,那麽與它關聯的碎片也進入了停止狀態。總體來說,進入停止狀態的碎片對用戶來說是完全不可見的,有可能被系統回收。

  4、碎片銷毀狀態:活動銷毀時,與它關聯的碎片也進入銷毀狀態。

  5、通過調用FragmentTransaction的:remove()、replace()方法能讓碎片從活動中移除,但是如果事務提交之前調用了:addToBackStack()方法,這時的碎片也會進入停止狀態;如果在事務提交之前沒有調用:addToBackStack()方法,這是碎片進入銷毀狀態。

  6、Fragment類中提供了一系列的回調方法,以覆蓋碎片生命周期的每個環節,其中活動有的回調方法,碎片幾乎都有,不過碎片還附加了一些回調方法:

      onAttach():當碎片和活動建立關聯的時候調用

      onCreateView():當碎片創建視圖(加載布局)的時候調用

      onActivityCreate():確保與碎片關聯的活動一定已經創建完畢的時候調用

      onDestroyView():當碎片關聯的視圖(布局)被移除的時候調用

      onDetach():當碎片和活動解除關聯的時候調用

  7、碎片的完整生命周期示意圖:

技術分享圖片

  8、體驗碎片的生命周期:

第一步:修改RightFragment碎片中的代碼

技術分享圖片

第二步:運行程序,打印日誌:

技術分享圖片

技術分享圖片

第三步:點擊Button按鈕,替換當前碎片,打印日誌

技術分享圖片

技術分享圖片

第四步:點擊Back鍵,打印日誌

技術分享圖片

技術分享圖片

第五步:再按Back鍵,打印日誌

技術分享圖片

技術分享圖片

拓展:

  在碎片中你也可以通過:onSaveInstanceState()方法來保存數據,因為進入停止狀態的碎片有可能在系統內存不足的時候被回收,保存下來的數據在onCreate()、onCreateView()、onActivityCreate()這三個方法中都可以重新得到,他們都包含了一個Bundle類型的onSaveInstanceState參數。代碼可以參考:https://www.cnblogs.com/hh8888-log/p/9873057.html

五、動態加載布局的技巧

  程序能夠根據設備的分辨率或屏幕的大小在運行時決定加載哪種布局

方法一:使用限定符(Qualifiers)

  Android中常見的限定符如下:

技術分享圖片

下面我們使用:large 限定符來模擬手機自動加載單頁模式,平板自動加載雙頁模式:

第一步:把activity_main.xml布局設置為單頁模式

技術分享圖片

第二步:在res目錄下新建layout-large文件夾,在該文件夾下新建:activity_main.xml,將該布局設置為雙頁模式:

技術分享圖片

第三步:在MainActivity活動中將replaceFragment方法中的代碼註釋掉

技術分享圖片

第四步:在平板模擬器上運行程序(左)和在手機模擬器上運行程序(右)

    結果顯示:在平板模擬器上運行程序的時候,會自動加載:large/activity_main.xml布局;在手機模擬器上運行程序的時候,會自動加載:layout/activity_main.xml布局。

技術分享圖片 技術分享圖片

方法二:使用最小寬度限定符(Smallest-width Qualifiers)

  最小寬度限定符:對屏幕寬度指定一個最小值(以dp為單位),以這個最小值為臨界點,屏幕寬度大於這個值的設備加載一個布局,屏幕寬度小於這個值的設備加載另外一個布局。

例如:

  在res目錄下新建一個文件夾:layout-sw600dp,然後在該文件夾下新建:activity_main.xml,代碼如下,當程序在屏幕寬度大於600dp的設備上運行時,會自動加載:sw600dp/activity_main.xml布局,當程序在屏幕寬度小於600dp的設備上運行時,會自動加載:layout/activity_main.xml布局。

技術分享圖片

Android學習之基礎知識七—碎片的使用