Tôi đã điều tra vấn đề này, đề cập đến các tài liệu LayoutInflater và thiết lập một dự án trình diễn mẫu nhỏ. Các hướng dẫn sau đây cho thấy cách tự động điền bố cục bằng cách sử dụng LayoutInflater
.
Trước khi chúng ta bắt đầu, hãy xem LayoutInflater.inflate()
các tham số trông như thế nào:
- tài nguyên : ID cho tài nguyên bố cục XML để tải (ví dụ
R.layout.main_page
:)
- root : Chế độ xem tùy chọn là cha mẹ của hệ thống phân cấp được tạo (nếu
attachToRoot
là true
) hoặc đơn giản là một đối tượng cung cấp một tập hợp các LayoutParams
giá trị cho gốc của cấu trúc phân cấp được trả về (nếu attachToRoot
là false
.)
Đính kèm : Có nên gắn hệ thống phân cấp tăng cao vào tham số gốc không? Nếu sai, root chỉ được sử dụng để tạo lớp con chính xác LayoutParams
cho chế độ xem gốc trong XML.
Trả về : Giao diện gốc của hệ thống phân cấp bị thổi phồng. Nếu root được cung cấp và attachToRoot
là true
, đây là root; mặt khác, nó là gốc của tệp XML bị thổi phồng.
Bây giờ cho bố trí mẫu và mã.
Bố cục chính ( main.xml
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
Được thêm vào thùng chứa này là một TextView riêng biệt, hiển thị dưới dạng hình vuông nhỏ màu đỏ nếu các tham số bố cục được áp dụng thành công từ XML ( red.xml
):
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
Bây giờ LayoutInflater
được sử dụng với một số biến thể của các tham số cuộc gọi
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
Các kết quả thực tế của các biến thể tham số được ghi lại trong mã.
TRIỆU CHỨNG: Gọi LayoutInflater
mà không chỉ định gốc dẫn đến lạm phát cuộc gọi bỏ qua các tham số bố cục từ XML. Gọi thổi phồng với root không bằng null
và attachRoot=true
không tải các tham số bố trí, nhưng trả lại đối tượng gốc, điều này ngăn các thay đổi bố cục tiếp theo đối tượng được tải (trừ khi bạn có thể tìm thấy nó bằng cách sử dụng findViewById()
). Do đó, quy ước gọi mà bạn rất muốn sử dụng là quy ước này:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
Để giúp giải quyết các vấn đề về bố cục, Trình kiểm tra Bố cục rất được khuyến khích.