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">
<includeandroid:id="@+id/cell1"layout="@layout/workspace_screen"/>
<includeandroid:id="@+id/cell2"layout="@layout/workspace_screen"/>
<includeandroid: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元素了。