第一行程式碼——第四章:手機平板要兼顧——探究碎片
目錄:
知識點:
4.1 碎片是什麼
碎片(Fragment)是一種可以嵌人在活動當中的uI片段,它能讓程式更加合理和充分地利用大螢幕的空間,因而在平板上應用得非廣泛。雖然碎片對你來說應該是個全新的概念,但我相信你學習起來應該毫不費力,因為它和活動實在是太像了,同樣都能包含佈局,同樣都有自己的生命週期。你甚至可以將碎片理解成一一個迷 你型的活動,雖然這個迷你型的活動有可能和普通的活動是一樣大的。
4.2 碎片的使用方式
4.2.1 碎片的簡單用法
首先在Activity中建立 fragment
這裡我們通過name 屬性來顯式指明要新增的碎片類名
<fragment android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" android:id="@+id/frag_list" android:name="com.dak.administrator.firstcode.tablet_device.ListFragment" />
而後建立ListFragment類
public class ListFragment extends Fragment { @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_list,container,false); return super.onCreateView(inflater, container, savedInstanceState); } }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.dak.administrator.firstcode.tablet_device.ListFragment">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/recy"
>
</android.support.v7.widget.RecyclerView>
</LinearLayout>
如此即可
4.2.2 動態新增碎片
建立待新增的碎片例項
獲取到FragmentManager,呼叫getFragmentManager()方法得到。
呼叫beginTransaction()開啟一個事物。
向內容器加入碎片,使用replace()實現(傳入容器的id和待新增碎片的例項)
用commit(),提交事務。
FragmentManager fragmentManager = getSupportFragmentManager();
android.support.v4.app.FragmentTransaction transaction=fragmentManager.beginTransaction();
transaction.replace(R.id.frame_frag, new ListFragment());
transaction.commit()
4.2.3 在碎片中模擬返回棧
在commit之前,加入addToBackStack()方法。
此時按下返回鍵,可以回到上一個碎片。
4.2.4 碎片和活動之間進行通訊
在活動中得到相應碎片的例項,呼叫FragmentManager的findFragmentById。
在碎片中獲取當前活動例項,MainActivity activity = (MainActivity)getActivity();
4.3 碎片的生命週期
碎片除了Activity中的生命週期外,還有:
onAttach() 碎片和活動建立關係時呼叫。
onCreateView() 載入碎片佈局
onActivityCreated() 碎片和活動建立完畢時呼叫。
onDestoryView() 當與碎片關聯檢視被移除的時候呼叫。
onDetach() 碎片和活動解除關係時呼叫。
4.3.1 碎片的狀態和回撥
執行狀態:當一個碎片可見,並且它所關聯的活動正處於執行狀態時,該碎片也處於執行狀態
暫停狀態:當一個活動進入暫停狀態時(由於另一個未佔滿螢幕的活動被新增到了棧頂)與它相關聯的可見碎片就會進人到暫停狀態。
停止狀態: 當一個活動進入停止狀態時,與他相關的相關聯的碎片就會進人到停止狀態,或者通過呼叫FragmentTransaction的remove(),replace()方法將碎片從活動中移除,但如果在事務提交之前調動addToBackStack() 方法,這時的碎片也會進入停止狀態。總的來說,進入停止狀態的碎片對使用者來說是完全不可見的,有可能會被系統回收。
銷燬狀態:碎片總是依附於活動而存在的,因此當活動被銷燬時,與它相關聯的碎片就會進人到銷燬狀態。或者通過呼叫FanentTransaction的remove()、replace()方法將碎片 從活動中移除,但在事務提交之前並沒有呼叫addToBackStack()方法,這時的碎片也會進人到銷燬狀態。結合之前的活動狀態,相信你理解起來應該毫不費力吧。同樣地,Fragment 類中也提供了一系列的回撥方法, 以覆蓋碎片生命週期的每個環節。其中,活動中有的回撥方法,碎片中幾乎都有,不過碎片還提供了些附加的回撥方法, 那我們就重點看一下這幾個回撥。
- onAttach() 當碎片和活動建立關聯的時候呼叫。
- onCreateView() 為碎片建立檢視(載入佈局)時呼叫。
- onActivityCreated() 確保與碎片相關聯的活動一定已經建立完畢 的時候呼叫。
- onDestroyView() 當與碎片關聯的檢視被移除的時候呼叫。
- onDetach()。 當碎片和活動解除關聯的時候呼叫。
4.3.2 體驗碎片的生命週期
完整:
onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart()
onResume()
onPause()
onStop()
onDestory()
onDetach()
4.4 動態載入佈局的技巧
新建layout-large資料夾,(雙頁模式,兩個佈局),大螢幕就會載入這個佈局
小螢幕就會載入 另一個佈局
4.4.1 使用限定符
在res目錄下新建layout-large,新建一個同樣的佈局 比如說 activity_main.xml
<?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:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/frag_list"
android:name="com.dak.administrator.firstcode.tablet_device.ListFragment"
/>
<FrameLayout
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frag_details"
android:name="com.dak.administrator.firstcode.tablet_device.DetailsFragment"
/>
</FrameLayout>
</LinearLayout>
原layout 目錄下的activity_main.xml 佈局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context="com.dak.administrator.firstcode.tablet_device.MainActivity">
<fragment
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:id="@+id/frag_list"
android:name="com.dak.administrator.firstcode.tablet_device.ListFragment"
/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/frame_frag"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_1"
/>
</FrameLayout>
</LinearLayout>
可以看到,layout/activity_main 佈局只包含了一個碎片,即單頁模式,而layout-large/activity_main佈局包含了兩個碎片,即雙頁模式,其中large就是一個限定符
- small:提供給小螢幕的資源
- normal:提供給中等螢幕的資源
- large:提供給大螢幕的資源
- xlarge:提供給超大螢幕的資源
- land:提供給橫屏裝置的資源
- port:提供給豎屏裝置的資源
4.4.2 使用最小寬度限定符
最小寬度限定符允許我們對螢幕的寬度制定一個最小值(以dp為單位),然後以這個為臨界點,大於這個值得裝置就加在一個佈局,小於這個值得裝置就加在另一個佈局
我們同樣在res目錄下新建 layout-sw600dp 意味著,當程式執行在螢幕寬度大於600dp的裝置上時,便會加在當下目錄下的佈局。
4.5 碎片的最佳實踐——一個簡易版的新聞應用
https://blog.csdn.net/u013678930/article/details/50834702
4.6 小結與點評
郭霖總結:
你應該可以感覺到,上一節中我們開發的新聞應用, 程式碼複雜度還是有點高的,比起只需要相容一 個終端的應用,我們要考慮的東西多了很多。不過在開發的過程中多付出一些,在以後的程式碼維護中就可以輕鬆很多。因此,有時候提前的付出還是很值得的。
我們再來回顧一下 本章所學的內容吧,首先你瞭解了碎片的基本概念以及使用場景,接著通過幾個例項掌握了碎片的常見用法,隨後又學習了碎片生命週期的相關內容以及動態載入佈局的技巧,最後在本章的最佳實踐部分將前面所學的內容綜合運用了一遍,相信你已經將碎片相關知識點都牢記在心,並可以較為熟練地應用了。
本章其實是具有一個里程碑式的紀念意 義的,因為到這裡為止,我們已經基本將AndroidUI相關的重要知識點都講完了。後面在很長-段時間內都不會再系統性地介紹Ul方面的知識,而是將結合前面所學的u知識來更好地講解相應章節的內容。那麼我們下一直將要學習什麼呢?還記再在第章裡介紹過的Adoid四大元件吧?目前我們只掌握了活動這一個元件,那麼下一章就來學習廣播接收器吧。跟上腳步,準備繼續前進!
我的總結:
這一章內容還是很有必要去記住的,雖然在我的工作當中去進行平板適配的內容比較少,但是這仍然是不可避免的。當我們的應用越做越大的時候,難免會去進行平板的適配。