RelativeLayout соответствует родителю, хотя это не должно

Я пытаюсь создать макет сообщения в приложении чата.

Этот макет сообщения должен содержать:

  • Текстовое представление сообщения в прямоугольнике с закругленными углами
  • Значок проверки статуса сообщения ImageView в этом же прямоугольнике
  • Время отправки сообщения TextView вне прямоугольника с закругленными углами и справа от него.

Когда текст короткий, весь макет должен выровняться вправо. Когда текст длинный, сообщение TextView будет расширяться влево и, касаясь левой стороны экрана, расширяется до нового ряда.

Проблема в том, что прямоугольник со скругленными углами простирается на весь экран, независимо от того, является ли сообщение коротким или длинным, хотя оно FrameLayout ширина установлена ​​в wrap_content.

Вот изображение проблемы:

Макет, который я использую:

<RelativeLayout
    android:id="@+id/outer_rl"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingLeft="8dp"
    android:paddingTop="8dp">

    <TextView
        android:id="@+id/text_message_time"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:layout_alignParentEnd="true"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        android:textSize="10sp"
        app:showDate="@{message.postedAt}" />

    <RelativeLayout
        android:id="@+id/bubble_ll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@id/text_message_time"
        android:background="@drawable/rounded_rectangle_bubble_sent"
        android:padding="8dp">

        <ImageView
            android:id="@+id/iv_check"
            android:layout_width="12dp"
            android:layout_height="12dp"
            android:layout_alignParentRight="true"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="4dp"
            app:setStatusPng="@{message.status}" />

        <TextView
            android:id="@+id/messagetext_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="6dp"
            android:layout_marginRight="6dp"
            android:layout_marginTop="2dp"
            android:layout_toLeftOf="@id/iv_check"
            android:singleLine="false"
            android:text="@{message.messageText}"
            android:textColor="#ffffff" />

    </RelativeLayout>
</RelativeLayout>

Внутренний RelativeLayout названный bubble_ll имеет ширину, равную wrap_content,

Я ожидаю, что это:

  • text_message_time TextView должен быть присоединен к правой части экрана, поскольку его свойство layout_alignParentEnd установлено в значение true.
  • bubble_ll стоит слева от представления text_message_time из-за своего набора свойств layout_toLeftOf. И он должен иметь ширину своего содержимого.

Я пробовал другие макеты, такие как Linear, ConstraintLayout и т. Д.

LinearLayout подход не сработал, так как ширина установлена wrap_content за TextView всегда перекрывает проверки информации о состоянии и время сообщения заставляет их исчезнуть, когда сообщение в TextView это долго.

С ConstraintLayout Я не мог выровнять пузырь, чтобы оставаться неподвижным справа. Он остается в центре экрана горизонтально, поскольку он ограничен обеими горизонтальными сторонами экрана.

Любая помощь будет оценена.

1 ответ

Решение

Я придумал следующий макет, который представляет собой комбинацию RelativeLayout а также LinearLayout, Я надеюсь, что это служит вашей цели. Пожалуйста, измените Drawables и ID, если это необходимо.

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

    <TextView
        android:id="@+id/text_message_time"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/message_container"
        android:layout_alignParentRight="true"
        android:layout_margin="4dp"
        android:text="10:30 am"
        android:textSize="10sp" />

    <LinearLayout
        android:id="@+id/message_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="8dp"

        android:layout_toLeftOf="@+id/text_message_time"
        android:background="@android:color/holo_blue_dark"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/messagetext_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="4dp"
            android:layout_weight="1"
            android:padding="4dp"
            android:singleLine="false"
            android:text="You have a long message here. This is so long that it takes two lines inside the TextView. No wonder, now its taking three lines and now its four. How long this message can go? I now have that question!!!"
            android:textColor="@android:color/white" />

        <ImageView
            android:id="@+id/iv_check"
            android:layout_width="12dp"
            android:layout_height="12dp"
            android:layout_centerVertical="true"
            android:layout_margin="8dp"
            android:src="@android:drawable/presence_online" />
    </LinearLayout>
</RelativeLayout>
Другие вопросы по тегам