Создайте фигуру для фона чата:
shape_pill_background.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:bottomLeftRadius="40dp"
android:bottomRightRadius="40dp"
android:radius="40dp"
android:topLeftRadius="40dp"
android:topRightRadius="40dp" />
<solid android:color="#555555" />
<padding
android:bottom="0dp"
android:left="0dp"
android:right="0dp"
android:top="0dp" />
<size android:height="40dp" />
</shape>
создайте рисуемую стрелку:
shape_arrow_down.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<rotate
android:fromDegrees="45"
android:pivotX="230%"
android:pivotY="30%"
android:toDegrees="45">
<shape android:shape="rectangle">
<solid android:color="#555555" />
</shape>
</rotate>
</item>
</layer-list>
найдите ресурс, который лучше всего представляет вашу «золотую» стрелку, я взял встроенный векторный ресурс студии Android, который будет называться ic_arrow_forward_wattle_24dp.xml. Создайте свой макет:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.constraint.ConstraintLayout
android:id="@+id/constraintLayoutTextBubble"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:background="@drawable/shape_pill_background"
android:padding="16dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textViewInput"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:background="#919191"
android:padding="4dp"
android:text="This is a text message"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/imageViewArrow"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/imageViewArrow"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginEnd="8dp"
app:layout_constraintBottom_toBottomOf="@+id/textViewInput"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/textViewInput"
app:layout_constraintTop_toTopOf="@+id/textViewInput"
app:srcCompat="@drawable/ic_arrow_forward_wattle_24dp" />
</android.support.constraint.ConstraintLayout>
<View
android:id="@+id/viewDownArrow"
android:layout_width="22dp"
android:layout_height="40dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:background="@drawable/shape_arrow_down"
app:layout_constraintEnd_toEndOf="@+id/constraintLayoutTextBubble"
app:layout_constraintStart_toStartOf="@+id/constraintLayoutTextBubble"
app:layout_constraintTop_toBottomOf="@+id/constraintLayoutTextBubble" />
</android.support.constraint.ConstraintLayout>
Результат будет выглядеть следующим образом:

Однако с этим есть несколько проблем. Когда у вас есть довольно большое сообщение, оно вытолкнет стрелку ImageView из пузыря из-за того, как wrap_content работает в цепочках и макете ограничений. Я предлагаю вам попробовать дать вашему сообщению TextView фиксированную ширину или установить ее ширину в соответствии с ограничениями. Это придаст вашему тексту серый фон там, где текста нет. Поиграйте с ним и посмотрите, что лучше всего подходит для вас.
Спасибо бко. Но я пытаюсь создать все это динамически. (поскольку на основе вывода json количество текстовых представлений в прокручиваемом макете может измениться.) Поэтому я боюсь, что это не так просто, как использовать файл макета. Но да, еще раз спасибо за код. Я попытаюсь использовать это и попытаться создать их динамически.