【问题标题】:Relative Layout ignoring setMargin()忽略 setMargin() 的相对布局
【发布时间】:2011-12-31 19:20:39
【问题描述】:

我正在尝试将RelativeLayout 嵌套在LinearLayout 内,并为RelativeLayout 提供一个边距,使其边缘远离LinearLayout 的边缘。到目前为止,我有这个:

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 边缘到父边缘。 有人知道要设置这些边距必须做些什么吗?或者也许有更好的方法来完全做到这一点? 赞赏。

【问题讨论】:

    标签: android android-layout android-widget


    【解决方案1】:

    编辑:

    您使用的是 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);
    

    【讨论】:

    • 如果这是他的问题,他会得到一个类转换异常。 MarginLayoutParams 是 LinearLayout.LayoutParams、RelativeLayout.LayoutParams 等的超类。除了 setLayoutParams() 实际所做的是将参数保留在成员字段中并调用 requestLayout() 所以只有这些调用中的一个应该发生(requestLayout() 或 setLayoutParams() 但不是两个一起)
    • Entreco,事实证明你是完全正确的,这是因为我创建了错误的参数所有者,但你提出的实现有点错误。这是最终工作的代码: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); requestLayout(); 感谢您的帮助!
    • 这对我不起作用。我在扩展的 LinearLayout 的构造函数中尝试了这个。无论我提供什么尺寸,边距都不会显示。有什么问题?
    • setLayoutParams(params) 已经自己调用了 requestLayout()。
    猜你喜欢
    • 2014-11-08
    • 2013-01-19
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多