#java #android #textview #android-constraintlayout
#java #Android #textview #android-constraintlayout
Вопрос:
Я хочу, чтобы 2 TextView были соединены вместе. И если первый содержит больше текста, он должен уменьшиться. В то же время, 2-й всегда должен показывать весь текст и не может сжиматься. Он должен добавляться в конец родительского представления, не должен выходить за пределы привязки, как я могу этого добиться?
Что я пробовал
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="40dp"
android:paddingTop="2dp"
android:paddingBottom="2dp">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@ id/avatarImg"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="4dp"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_oval="true"
tools:src="@mipmap/avatar_test" />
<TextView
android:id="@ id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:ellipsize="end"
android:lines="1"
android:textColor="@color/peach_red"
android:textSize="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@ id/avatarImg"
app:layout_constraintTop_toTopOf="parent"
tools:text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" />
<TextView
android:id="@ id/content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:textColor="@color/black1"
android:textSize="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@ id/name"
app:layout_constraintTop_toTopOf="parent"
tools:text="BBBBBBBBBBBBBBBBBBBBBB" />
</androidx.constraintlayout.widget.ConstraintLayout>
Результат
Редактировать:
Согласно ответу @ Gavin Wright. Я также хочу, чтобы второй был тесно связан с первым, если размер текста короткий. Это трудный момент, когда я могу этого достичь… Извините, что не упомянул заранее…
Ответ №1:
Первый TextView
должен иметь layout_width = 0dp
размер, так как это заставляет его занимать только оставшуюся ширину строки. Второй TextView
должен иметь layout_width = wrap_content
, так как это заставляет его занимать столько места, сколько необходимо для размещения его содержимого. Я также добавил app:layout_constraintEnd_toStartOf="@ id/content
, к первому TextView
, поскольку это необходимо для обеспечения взаимосвязи между ними TextViews
.
Это протестировано и отлично работает для меня:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="40dp"
android:paddingTop="2dp"
android:paddingBottom="2dp">
<com.makeramen.roundedimageview.RoundedImageView
android:id="@ id/avatarImg"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="4dp"
android:scaleType="centerCrop"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:riv_oval="true"
tools:src="@mipmap/avatar_test" />
<TextView
android:id="@ id/name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:ellipsize="end"
android:lines="1"
android:textColor="@color/peach_red"
android:textSize="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@ id/avatarImg"
app:layout_constraintEnd_toStartOf="@ id/content"
app:layout_constraintTop_toTopOf="parent"
tools:text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" />
<TextView
android:id="@ id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="end"
android:lines="1"
android:textColor="@color/black1"
android:textSize="12dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@ id/name"
app:layout_constraintTop_toTopOf="parent"
tools:text="BBBBBBBBBBBBBBBBBBBBBB" />
</androidx.constraintlayout.widget.ConstraintLayout>
Комментарии:
1. Пожалуйста, проверьте мое обновление для вопроса. Спасибо!
2. Это действительно усложняет ситуацию. Это все еще возможно, но вам придется делать это программно, а не в XML. В принципе, вам нужно будет измерить ширину
RoundedImageView
плюс ширину текста вTextViews
и определить, меньше ли они ширины экрана. Если они меньше, вы меняетеnameTextView
на havelayout_width = "wrap_content"
.3. Мне любопытно, есть ли более простой способ или нет. Если нет, я отмечу это как принятый ответ. Спасибо!
4. Вы можете делать некоторые сумасшедшие вещи с
ConstraintLayout
, но в этом случае я думаю, что слишком много логики для обработки этого в XML.