2011-11-17 32 views
18

Tôi đang cố gắng lồng một số RelativeLayout vào bên trong của một LinearLayout và cung cấp cho lề RelativeLayout một lề mà khoảng cách của nó nằm cách xa mép của LinearLayout. Cho đến nay tôi có điều này:Bố cục tương đối bỏ qua setMargin()

LayoutInflater.from(context).inflate(R.layout.conversation_view_layout, this, true); 

this.setLayoutParams(new MarginLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
int tbm = AllConversationsActivity.topAndBottomMargin; 
int lrm = AllConversationsActivity.leftAndRightMargin; 
((MarginLayoutParams) this.getLayoutParams()).setMargins(lrm, tbm, lrm, tbm); 
this.requestLayout(); 

Mà, nếu tôi đọc API chính xác, nên đặt lề của RelativeLayout thành số được chỉ định. Nó không phải là làm như vậy cả, nhưng thay vào đó dường như chỉ đơn giản là bỏ qua các setMargins() hoàn toàn.

Ngoài ra, đây là xml tôi

<merge xmlns:android="http://schemas.android.com/apk/res/android"> 

<ImageView 
    android:id="@+id/conversation_picture" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true"/> 

<TextView 
    android:id="@+id/conversation_person" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_toRightOf="@id/conversation_picture" 
    android:singleLine="true" 
    android:ellipsize="marquee"/> 

<TextView 
    android:id="@+id/conversation_length" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentRight="true"/> 

<TextView 
    android:id="@+id/conversation_first_line" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_below="@id/conversation_picture" 
    android:layout_alignParentLeft="true" 
    android:singleLine="true" 
    android:ellipsize="end"/> 

<TextView 
    android:id="@+id/conversation_last_time" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_below="@id/conversation_first_line" 
    android:layout_alignParentLeft="true" 
    android:singleLine="true" 
    android:ellipsize="marquee"/> 

Tôi có một nghi ngờ nhỏ rằng những quan điểm được buộc RelativeLayout cạnh đến cạnh cha mẹ khi họ thực hiện cuộc gọi liên kết của họ. Có ai đó biết phải làm gì để đạt được các lề này không? Hoặc có thể có một cách tốt hơn để làm điều này hoàn toàn? Được đánh giá cao.

Trả lời

32

Edit:

Bạn đang sử dụng MarginLayoutParams thay vì LinearLayoutParams. LƯU Ý: nếu bạn đặt LayoutParams trên vùng chứa bố cục, bạn sẽ cần phải sử dụng loại của cha mẹ.

Vì vậy, nếu bạn có LinearLayout chứa RelativeLayout, bạn cần đặt LinearLayout.LayoutParams trên RelativeLayout.

// NOT WORKING: LinearLayout.LayoutParams params = (LayoutParams) getLayoutParams(); 
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
int tbm = AllConversationsActivity.topAndBottomMargin; 
int lrm = AllConversationsActivity.leftAndRightMargin; 
params.setMargins(tbm, lrm, tbm, lrm); 
setLayoutParams(params); 
+0

Nếu đây là vấn đề, anh ấy sẽ nhận được ngoại lệ cho lớp học. MarginLayoutParams là một lớp siêu của LinearLayout.LayoutParams, RelativeLayout.LayoutParams và vân vân. Bên cạnh những gì setLayoutParams() thực sự làm là giữ các tham số trong một trường thành viên và gọi requestLayout() vì vậy chỉ một trong các cuộc gọi này sẽ được hapenning (hoặc requestLayout() hoặc setLayoutParams() nhưng không phải là hai với nhau) – asenovm

+2

Entreco, bạn quay đúng là chính xác, đó là vì tôi đã tạo sai chủ sở hữu của các thông số, nhưng việc triển khai bạn đưa ra là hơi sai. Dưới đây là đoạn code mà đã kết thúc làm việc: 'LinearLayout.LayoutParams params = LinearLayout.LayoutParams mới ( \t \t \t \t LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); \t \t int tbm = AllConversationsActivity.topAndBottomMargin; \t \t int lrm = AllConversationsActivity.leftAndRightMargin; \t \t params.setMargins (tbm, lrm, tbm, lrm); \t \t setLayoutParams (params); \t \t requestLayout(); ' Cảm ơn sự giúp đỡ của bạn! – blaineh

+0

tính năng này không hoạt động đối với tôi. Tôi đã thử điều này trong constructor LinearLayout mở rộng của tôi. Các lề không hiển thị ở tất cả không có vấn đề gì kích thước tôi cung cấp. Điều gì có thể sai? – faizal

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