android: 動態載入碎片佈局的技巧

yufan發表於2016-01-27

雖然動態新增碎片的功能很強大,可以解決很多實際開發中的問題,但是它畢竟只是在 一個佈局檔案中進行一些新增和替換操作。如果程式能夠根據裝置的解析度或螢幕大小在運 行時來決定載入哪個佈局,那我們可發揮的空間就更多了。因此本節我們就來探討一下 Android 中動態載入佈局的技巧。

 

4.4.1   使用限定符

 

如果你經常使用平板電腦,應該會發現很多的平板應用現在都採用的是雙頁模式(程式 會在左側的皮膚上顯示一個包含子項的列表,在右側的皮膚上顯示內容),因為平板電腦的 螢幕足夠大,完全可以同時顯示下兩頁的內容,但手機的螢幕一次就只能顯示一頁的內容,因此兩個頁面需要分開顯示。

那麼怎樣才能在執行時判斷程式應該是使用雙頁模式還是單頁模式呢?這就需要藉助 限定符(Qualifiers)來實現了。我們通過一個例子來學習一下它的用法,修改 FragmentTest 專案中的 activity_main.xml 檔案,程式碼如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

 

<fragment android:id="@+id/left_fragment" android:name="com.example.fragmenttest.LeftFragment" android:layout_width="match_parent" android:layout_height="match_parent" />

 

</LinearLayout>

這裡將多餘的程式碼都刪掉,只留下一個左側碎片,並讓它充滿整個父佈局。接著在 res 目錄下新建 layout-large 資料夾,在這個資料夾下新建一個佈局,也叫做 activity_main.xml, 程式碼如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

 

<fragment android:id="@+id/left_fragment" android:name="com.example.fragmenttest.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" />

 

<fragment android:id="@+id/right_fragment" android:name="com.example.fragmenttest.RightFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3" />

 

</LinearLayout>

 

 

 

可以看到,layout/activity_main 佈局只包含了一個碎片,即單頁模式,而 layout-large/

activity_main 佈局包含了兩個碎片,即雙頁模式。其中 large 就是一個限定符,那些螢幕被認 為是 large 的裝置就會自動載入 layout-large 資料夾下的佈局,而小螢幕的裝置則還是會載入 layout 資料夾下的佈局。

然後將 MainActivity 中按鈕點選事件的程式碼遮蔽掉,並在平板模擬器上重新執行程式, 效果如圖 4.13 所示。

 

 

圖   4.13

 再啟動一個手機模擬器,並在這個模擬器上重新執行程式,效果如圖 4.14 所示。

 

圖   4.14

這樣我們就實現了在程式執行時動態載入佈局的功能。

Android 中一些常見的限定符可以參考下表。

 

螢幕特徵

限定符

描述

 

 

大小

small

提供給小螢幕裝置的資源

normal

提供給中等螢幕裝置的資源

large

提供給大螢幕裝置的資源

xlarge

提供給超大螢幕裝置的資源

 

 

解析度

ldpi

提供給低解析度裝置的資源(120dpi 以下)

mdpi

提供給中等解析度裝置的資源(120dpi 到 160dpi)

hdpi

提供給高解析度裝置的資源(160dpi 到 240dpi)

xhdpi

提供給超高解析度裝置的資源(240dpi 到 320dpi)

 

方向

land

提供給橫屏裝置的資源

port

提供給豎屏裝置的資源

 

 

4.4.2    使用最小寬度限定符

 

在上一小節中我們使用 large 限定符成功解決了單頁雙頁的判斷問題,不過很快又有一 個新的問題出現了,large 到底是指多大呢?有的時候我們希望可以更加靈活地為不同裝置加 載布 局,不 管它們 是不是 被系統 認定為 “ large ”,這 時就可 以使用 最小寬 度限定 符

(Smallest-width Qualifier)了。

最小寬度限定符允許我們對螢幕的寬度指定一個最小指(以 dp 為單位),然後以這個最 小值為臨界點,螢幕寬度大於這個值的裝置就載入一個佈局,螢幕寬度小於這個值的裝置就 載入另一個佈局。

在 res 目錄下新建 layout-sw600dp 資料夾,然後在這個資料夾下新建 activity_main.xml

佈局,程式碼如下所示:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >

 

<fragment android:id="@+id/left_fragment" android:name="com.example.fragmenttest.LeftFragment" android:layout_width="0dp" android:layout_height="match_parent"

 

 

 

android:layout_weight="1" />

 

 

<fragment android:id="@+id/right_fragment" android:name="com.example.fragmenttest.RightFragment" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="3" />

 

</LinearLayout>

這就意味著,當程式執行在螢幕寬度大於 600dp 的裝置上時,會載入 layout-sw600dp/ activity_main 佈局,當程式執行在螢幕寬度小於 600dp 的裝置上時,則仍然載入預設的 layout/activity_main 佈局。

需要注意一點,最小寬度限定符是在 Android 3.2 版本引入的,由於這裡我們最低相容 的系統版本是 4.0,所以可以放心地使用它。

相關文章