1. 程式人生 > >第一行程式碼——第四章:手機平板要兼顧——探究碎片

第一行程式碼——第四章:手機平板要兼顧——探究碎片

目錄:

4.1 碎片是什麼

4.2 碎片的使用方式

4.2.1 碎片的簡單用法

4.2.2 動態新增碎片

4.2.3 在碎片中模擬返回棧

4.2.4 碎片和活動之間進行通訊

4.3 碎片的生命週期

4.3.1 碎片的狀態和回撥

4.3.2 體驗碎片的生命週期

4.4 動態載入佈局的技巧

4.4.1 使用限定符

4.4.2 使用最小寬度限定符

4.5 碎片的最佳實踐——一個簡易版的新聞應用

4.6 小結與點評


知識點:

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四大元件吧?目前我們只掌握了活動這一個元件,那麼下一章就來學習廣播接收器吧。跟上腳步,準備繼續前進!

我的總結:

這一章內容還是很有必要去記住的,雖然在我的工作當中去進行平板適配的內容比較少,但是這仍然是不可避免的。當我們的應用越做越大的時候,難免會去進行平板的適配。