Как уменьшить первый TextView, а не второй, если 2 TextView имеют длинный текст в ConstraintLayout?

#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 на have layout_width = "wrap_content" .

3. Мне любопытно, есть ли более простой способ или нет. Если нет, я отмечу это как принятый ответ. Спасибо!

4. Вы можете делать некоторые сумасшедшие вещи с ConstraintLayout , но в этом случае я думаю, что слишком много логики для обработки этого в XML.