Hoàn toàn có thể và được khuyến khích, để tạo chế độ xem vùng chứa tùy chỉnh. Đây là những gì Android sẽ gọi một điều khiển hợp chất. Vì vậy:
public class MyCustomView extends RelativeLayout {
private LinearLayout mContentView;
public MyCustomView(Context context) {
this(context, null);
}
public MyCustomView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyCustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
//Inflate and attach your child XML
LayoutInflater.from(context).inflate(R.layout.custom_layout, this);
//Get a reference to the layout where you want children to be placed
mContentView = (LinearLayout) findViewById(R.id.content);
//Do any more custom init you would like to access children and do setup
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
if(mContentView == null){
super.addView(child, index, params);
} else {
//Forward these calls to the content view
mContentView.addView(child, index, params);
}
}
}
Bạn có thể ghi đè lên nhiều phiên bản addView()
như bạn thấy cần thiết, nhưng cuối cùng, tất cả đều gọi lại phiên bản tôi đã đặt trong mẫu. Việc chỉ ghi đè phương thức này sẽ có khuôn khổ vượt qua tất cả các trẻ em được tìm thấy bên trong thẻ XML của nó vào một vùng chứa con cụ thể.
Và sau đó sửa đổi các XML như vậy:
res/layout/custom_layout.xml
<merge>
<SomeView />
<SomeOtherView />
<!-- maybe more layout stuff here later -->
<LinearLayout
android:id="@+id/content" />
</merge>
Lý do cho việc sử dụng <merge>
là để đơn giản hóa hệ thống phân cấp. Tất cả các chế độ xem con sẽ được đính kèm với lớp tùy chỉnh của bạn, là RelativeLayout
. Nếu bạn không sử dụng <merge>
, bạn kết thúc bằng một số RelativeLayout
được đính kèm với một số RelativeLayout
khác được đính kèm với tất cả trẻ em, điều này có thể gây ra sự cố.
HTH
Không phải là giải pháp, vì tôi nói tôi muốn xác định những đứa trẻ ở nơi khác (không phải trong giao diện tùy chỉnh). Chính xác hơn: Tôi có các tệp Bố cục a.xml, b.xml, c.xml - tất cả đều sử dụng cùng một chế độ xem tùy chỉnh, nhưng với các con khác nhau trong LinearLayout. – mreichelt
Điều đó hoàn toàn có thể chấp nhận được, và tôi sẽ nói phương pháp đơn giản nhất là ghi đè 'addView()' như bạn đã mô tả. Tôi đã chỉnh sửa ví dụ trên. – Devunwired
Cảm ơn bạn! Tốt để xem những vấn đề này được giải quyết ngay cả sau một thời gian dài! :) – mreichelt