Ứng dụng Android tôi đang phát triển có một hoạt động chính đã phát triển khá lớn. Điều này chủ yếu là vì nó chứa một TabWidget
với 3 tab. Mỗi tab có khá nhiều thành phần. Các hoạt động phải kiểm soát tất cả các thành phần cùng một lúc. Vì vậy, tôi nghĩ rằng bạn có thể tưởng tượng rằng Hoạt động này có 20 trường (một trường cho hầu hết mọi thành phần). Ngoài ra, nó chứa rất nhiều logic (nhấp vào trình nghe, logic để điền vào danh sách, v.v.).
Những gì tôi thường làm trong các khung dựa trên thành phần là chia mọi thứ thành các thành phần tùy chỉnh. Mỗi thành phần tùy chỉnh sau đó sẽ có một trách nhiệm rõ ràng. Nó sẽ chứa tập hợp các thành phần của riêng nó và tất cả các logic khác liên quan đến thành phần đó.
Tôi đã cố gắng tìm hiểu làm thế nào điều này có thể được thực hiện và tôi đã tìm thấy một cái gì đó trong tài liệu Android mà họ muốn gọi là "Điều khiển hợp chất". (Xem http://developer.android.com/guide/topics/ui/custom-components.html#compound và cuộn đến phần "Điều khiển hợp chất") Tôi muốn tạo một thành phần như vậy dựa trên tệp XML xác định xem cấu trúc.
Trong tài liệu có ghi:
Lưu ý rằng giống như với một Hoạt động, bạn có thể sử dụng cách tiếp cận khai báo (dựa trên XML) để tạo các thành phần có trong hoặc bạn có thể lồng chúng theo chương trình từ mã của mình.
Vâng, đó là tin tốt! Cách tiếp cận dựa trên XML chính xác là những gì tôi muốn! Nhưng nó không nói làm thế nào để làm điều đó, ngoại trừ việc nó "giống như với một Hoạt động" ... Nhưng những gì tôi làm trong một Hoạt động là kêu gọi setContentView(...)
làm tăng các khung nhìn từ XML. Phương thức đó không khả dụng nếu bạn ví dụ lớp con LinearLayout
.
Vì vậy, tôi đã cố gắng thổi phồng XML theo cách thủ công như thế này:
public class MyCompoundComponent extends LinearLayout {
public MyCompoundComponent(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.my_layout, this);
}
}
Điều này hoạt động, ngoại trừ thực tế là XML tôi đang tải đã LinearLayout
khai báo là phần tử gốc. Điều này dẫn đến việc bị thổi phồng LinearLayout
là một đứa trẻ MyCompoundComponent
mà chính nó đã là một LinearLayout
!! Vì vậy, bây giờ chúng ta có một linearLayout dự phòng ở giữa MyCompoundComponent
và các khung nhìn mà nó thực sự cần.
Ai đó có thể vui lòng cung cấp cho tôi một cách tốt hơn để tiếp cận điều này, tránh việc có ngay lập tức LinearLayout
không?