Android應用佈局技巧:創建可復用的UI組件

Android平臺提供瞭廣泛的UI可視組件—widget,把這些小的可視的構件組合到一起,就可以給用戶提供復雜而有用的界面。但是,應用程序經常需要一些高級可視組件,要滿足這樣的需求,並要達到高效的目的,可以把一些標準的widget組合成一個新的可復用的組件。

例如,包含一個進度條和一個取消按鈕的操作進度表示組件;包含兩個按鈕的面板(取消和確認操作);帶有一個圖標、標題和說明的面板等等。通過編寫定制的View類能夠很容易的創建UI組件,但是使用XML會更加容易。

在Android XML佈局文件中,每個標簽都對應於一個實際的類實例(這個類始終是View類的子類),Android的UI工具集中還有三個特殊的標簽,它們沒有對應的View實例:<requestFocus />、<merge />和<include />。本文展示如何使用<include />標簽來創建純粹的XML可視組件。有關如何使用<merge />的信息,請看“合並佈局”的文章,它跟<include />

組合起來使用,功能會更強大。

顧名思義,<include />標簽是要在當前佈局中包含另一個XML佈局。這個標簽的使用就像下例顯示的那樣簡單,例子中直接引用瞭Android的Home應用程序的源代碼:

<com.android.launcher.Workspace
    android:id="@+id/workspace"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    launcher:defaultScreen="1">

    <include android:id="@+id/cell1" layout="@layout/workspace_screen" />
    <include android:id="@+id/cell2" layout="@layout/workspace_screen" />
    <include android:id="@+id/cell3" layout="@layout/workspace_screen" />

</com.android.launcher.Workspace>

在<include />中隻有layout屬性是必須的。這個屬性的值不帶有android命名空間的前綴,它是希望要包含的佈局文件的引用。在例子中,相同的佈局被包含瞭三次。這個標簽還能夠覆蓋一些被包含佈局的屬性。上例中的android:id指定瞭被包含佈局的根View的id;如果定義瞭一個新的id,那麼被包含佈局的這個id也會被覆蓋。類似的,可以覆蓋所有的佈局參數。就意味著任何android:layout_*屬性都可以在<include />標簽中使用。以下示例中,相同的佈局被包含瞭兩次,但隻有第一次覆蓋瞭佈局屬性:

<!– override the layout height and width –>
<includelayout="@layout/image_holder"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"/>
<!– do not override layout dimensions; inherit them from image_holder –>
<includelayout="@layout/image_holder"/>

警告:如果要覆蓋佈局的尺寸,就必須同時覆蓋android:layout_height和android:layout_width屬性—不能隻覆蓋高度或隻覆蓋寬度。如果隻覆蓋其中一個,不會有任何效果。沒有覆蓋的屬性,依然會繼承源佈局中的屬性設置。

在需要根據設備的配置來定制UI部分時,這個標記時特別有用的。例如,Activity的主佈局可以被放到layout/目錄中,然後包含保存在layout-land/和layout-port/目錄中的另外佈局,這樣就可以在橫屏和縱屏的佈局中共享大多數的UI元素瞭。

 

摘自 FireOfStar的專欄

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *