Thẻ bao gồm
Các <include>
thẻ cho phép bạn phân chia bố cục của bạn thành nhiều file: nó giúp đối phó với phức tạp giao diện người dùng hoặc quá dài.
Giả sử bạn chia nhỏ bố cục phức tạp của mình bằng hai tệp bao gồm như sau:
top_level_activity.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<include layout="@layout/include1.xml" />
<!-- Second include file -->
<include layout="@layout/include2.xml" />
</LinearLayout>
Sau đó, bạn cần phải viết include1.xml
và include2.xml
.
Hãy nhớ rằng xml từ các tệp đính kèm chỉ đơn giản được đổ vào top_level_activity
bố cục của bạn tại thời điểm kết xuất (khá giống với #INCLUDE
macro cho C).
Các tập tin bao gồm là bố trí jane đơn giản xml.
bao gồm1.xml :
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
... và include2.xml :
<?xml version="1.0" encoding="utf-8"?>
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/button1"
android:text="Button" />
Xem? Không có gì lạ mắt. Lưu ý rằng bạn vẫn phải khai báo không gian tên Android với xmlns:android="http://schemas.android.com/apk/res/android
.
Vì vậy, phiên bản được kết xuất của top_level_activity.xml là:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="First include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
Trong mã java của bạn, tất cả điều này là trong suốt: findViewById(R.id.textView1)
trong lớp hoạt động của bạn trả về đúng widget (ngay cả khi tiện ích đó được khai báo trong tệp xml khác với bố cục hoạt động).
Và anh đào trên đỉnh: trình soạn thảo trực quan xử lý mọi thứ một cách bơi lội. Bố cục cấp cao nhất được hiển thị với xml đi kèm.
Các âm mưu dày
Vì tệp bao gồm là tệp xml bố cục cổ điển, điều đó có nghĩa là nó phải có một phần tử trên cùng. Vì vậy, trong trường hợp tệp của bạn cần bao gồm nhiều hơn một widget, bạn sẽ phải sử dụng bố cục.
Hãy nói rằng include1.xml
bây giờ có hai TextView
: một bố cục phải được khai báo. Hãy chọn một LinearLayout
.
bao gồm1.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
Các top_level_activity.xml sẽ được trả lại như sau:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<LinearLayout
android:id="@+id/layout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</LinearLayout>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
Nhưng chờ hai cấp LinearLayout
là dư thừa !
Thật vậy, hai cái lồng LinearLayout
không phục vụ mục đích vì cả hai TextView
có thể được bao gồm bên dưới layout1
cho cùng một kết xuất .
Vậy chúng ta có thể làm gì?
Nhập thẻ hợp nhất
Các <merge>
thẻ chỉ là một thẻ giả cung cấp một yếu tố cấp cao nhất để đối phó với loại vấn đề dư thừa.
Bây giờ include1.xml trở thành:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
</merge>
và bây giờ top_level_activity.xml được hiển thị là:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<!-- First include file -->
<TextView
android:id="@+id/textView1"
android:text="Second include"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<TextView
android:id="@+id/textView2"
android:text="More text"
android:textAppearance="?android:attr/textAppearanceMedium"/>
<!-- Second include file -->
<Button
android:id="@+id/button1"
android:text="Button" />
</LinearLayout>
Bạn đã lưu một cấp bậc, tránh một chế độ xem vô dụng: Romain Guy ngủ ngon hơn rồi.
Bây giờ bạn có hạnh phúc hơn không?
<TextView />
, không có gì khác.