2012-06-25 53 views
18

Tôi phải tạo chế độ xem tùy chỉnh phức tạp hơn trong Android. Cách bố trí cuối cùng sẽ trông như thế này:Android: Nhiều chế độ xem cho chế độ xem tùy chỉnh với bố cục hiện tại

<RelativeLayout> 
    <SomeView /> 
    <SomeOtherView /> 
    <!-- maybe more layout stuff here later --> 
    <LinearLayout> 
    <!-- the children --> 
    </LinearLayout> 
</RelativeLayout> 

Tuy nhiên, trong các tập tin XML Tôi chỉ muốn làm định nghĩa này (mà không xác định SomeView, SomeOtherView vv):

<MyCustomView> 
    <!-- the children --> 
</MyCustomView> 

Đây có phải là có thể trong Android, và nếu có: Điều gì sẽ là cách sạch nhất để làm điều đó? Các giải pháp có thể đến với tâm trí của tôi là 'ghi đè phương thức addView()' và 'xóa tất cả các chế độ xem và thêm lại ...'

Xin cảm ơn trước rất nhiều về sự giúp đỡ của bạn! :)

Trả lời

34

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

+0

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

+0

Đ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

+0

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

-3

bạn có thể sử dụng bao gồm thẻ

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> 
    <include android:id="@+id/nav_bar_layout" layout="@layout/nav_bar" android:layout_above="@+id/web_view" /> 
    <WebView android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/web_view" android:layout_centerInParent="true" /> 
    <include android:id="@+id/admob_layout" layout="@layout/admob_layout" android:layout_below="@+id/web_view" /> 
</RelativeLayout> 
+1

Tôi đã viết rằng tôi không muốn xác định (hoặc bao gồm) các chế độ xem mỗi khi tôi sử dụng chế độ xem tùy chỉnh của mình, bởi vì cuối cùng chúng _belong_ đến chế độ xem tùy chỉnh. – mreichelt

Các vấn đề liên quan