2011-11-17 74 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