2011-11-17 72 views
18

我試圖在LinearLayout中嵌套RelativeLayout,並給RelativeLayout一個邊距,使其邊緣遠離LinearLayout的邊緣。到目前爲止,我有這樣的:相對佈局忽略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(); 

其中,如果我正確地讀API,應設置的RelativeLayout的指定數量的空白。它根本沒有這樣做,但似乎完全忽略了setMargins()

而且,這裏是我的xml

<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"/> 

我有一個小的懷疑,這些觀點都迫使RelativeLayout邊緣父邊緣時,他們讓自己的定位電話。 有人知道必須做些什麼來獲得這些利潤率?或者也許有更好的方法來完成這一點? 讚賞。

回答

32

編輯:

您正在使用MarginLayoutParams代替LinearLayoutParams。 注意:如果您在佈局容器上設置LayoutParams,則需要使用父級的容器類型。

因此,如果您有一個包含RelativeLayout的LinearLayout,則需要在RelativeLayout上設置LinearLayout.LayoutParams。

// 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

如果這是他的問題,他會得到一個類拋出異常。 MarginLayoutParams是LinearLayout.LayoutParams,RelativeLayout.LayoutParams等的超類。除了setLayoutParams()實際做的是將參數保存在成員字段中,並調用requestLayout(),所以這些調用中只有一個應該是hapenning(requestLayout()或setLayoutParams(),但不是兩者一起) – asenovm

+2

10 Entreco,完全正確,那是因爲我創建了params的錯誤所有者,但是你實施的實現有點不對。下面是結束了工作代碼: 'LinearLayout.LayoutParams PARAMS =新LinearLayout.LayoutParams( \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();' 感謝您的幫助! – blaineh

+0

這不適合我。我在我的擴展的LinearLayout的構造函數中嘗試了這個。無論我提供什麼尺寸,邊緣都不會顯示出來。什麼可能是錯的? – faizal