Подтвердить что ты не робот

Почему marginBottom не работает?

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/messageLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/messageSender"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"/>

    <TextView
        android:id="@+id/messageSenderName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/messageSender"
        android:ellipsize="end"
        android:maxLines="1"
        android:singleLine="false"
        android:textColor="@color/list_text_color"
        android:textSize="16dp"
        android:layout_marginTop="5dp" />

    <TextView
        android:id="@+id/messageContent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/messageSender"
        android:layout_below="@id/messageSenderName"
        android:ellipsize="end"
        android:maxLines="1"
        android:singleLine="false"
        android:textColor="@color/codeFont"
        android:textSize="13dp"/>
</RelativeLayout>

В моем макете у меня проблема. Когда я устанавливаю marginTop="5dp", это хорошо, но когда я использую marginBottom, в моем макете ничего не происходит. Также, когда я устанавливаю дополнение в RelativeLayout, он тоже не работает. В чем проблема? Не могли бы вы дать мне какое-либо решение?

4b9b3361

Ответ 1

marginBottom не действует, если вы установите android:layout_height="wrap_content" для <RelativeLayout>, вместо этого установите его как match_parent и проверьте.

Ответ 2

Это просто ошибка <RelativeLayout>, поэтому вы можете попытаться обернуть RelativeLayout внутри <LinearLayout> и установить там маржу.

Ответ 3

Я не уверен, в какой версии Android вы столкнулись с этой проблемой. Я посмотрел RelativeLayout в Android 4.2.2 (https://android.googlesource.com/platform/frameworks/base/+/android-4.2.2_r1.1/core/java/android/widget/RelativeLayout.java), и я считаю, что в onMeasure есть ошибка.

В строках с 486 по 488 мы имеем следующий код:

if (isWrapContentHeight) {
    height = Math.max(height, params.mBottom);
}

По моему мнению, вышесказанное должно гласить:

if (isWrapContentHeight) {
    height = Math.max(height, params.mBottom + params.bottomMargin);
}

С андроидом: layout_height = "wrap_content", RelativeLayout не появляется, принимая во внимание нижний маркер последнего вертикально выложенного представления.

Я предлагаю вам попробовать одно из следующих:

*) Добавьте фиктивный вид, который будет самым последним вертикально выложенным представлением, и убедитесь, что он имеет атрибут android: layout_below. Обратите внимание, что фиктивный вид не имеет нижнего поля, он существует, поэтому RelativeLayout рассматривает нижний край представлений, выложенный над ним. Для вашего случая, фиктивный вид будет выглядеть так:

<View
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_below="@id/messageSender"
/>

*) Как уже упоминалось, достичь такого же эффекта другими способами, например, Padding.

*) Не так-тривиальное решение включает RelativeLayout, его определения стиля платформы и классы управления пулами в ваш проект, выполняет исправление ошибок, упомянутое выше, и использую его везде, где вы обычно используете RelativeLayout.

*) Запишите ошибку в Google

Надеюсь, что это поможет.

Ответ 4

Возможно, вы можете установить android:paddingBottom="" of <RelativeLayout>, чтобы получить тот же эффект.

Ответ 5

Убедитесь, что layout_height вашего корневого контейнера установлен на match_parent вместо wrap_content.

Ответ 6

У меня был <View> внутри <RelativeLayout> а marginBottom в этом представлении не работал. Я обнаружил, что моя цепочка layout_below была разорвана, поэтому имеет смысл, чтобы макет не знал, из какого вида следует рассчитывать маржу.

Если вы layout_below его правильно, используя layout_below или другие инструменты позиционирования, вам не нужно беспокоиться о wrap_content или match_parent как предлагают другие. Пример:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <View
        android:id="@+id/separator"
        android:layout_width="match_parent"
        android:layout_height="1px"
        android:layout_marginBottom="11dp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/separator">

        ...

Ответ 7

Он работает, если вы используете android:layout_marginBottom with android:layout_alignParentBottom="true".

Например:

android:layout_alignParentBottom="true"
android:layout_marginBottom="50dp">