Относительное расположение, игнорирующее setMargin () - PullRequest
18 голосов
/ 18 ноября 2011

Я пытаюсь вложить 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 к родительским ребрам, когда они выполняют свои вызовы выравнивания. Кто-нибудь знает, что нужно сделать, чтобы установить эти поля? Или, может быть, есть лучший способ сделать это полностью? Оценил.

1 Ответ

34 голосов
/ 18 ноября 2011

Изменить:

Вы используете MarginLayoutParams вместо LinearLayoutParams. ПРИМЕЧАНИЕ. Если вы установите LayoutParams в контейнере макета, вам нужно будет использовать тип родительского элемента.

Поэтому, если у вас есть LinearLayout, который содержит RelativeLayout, вам нужно установить LinearLayout.LayoutParams для 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...