Вариант использования: две однострочные TextView
, расположенные горизонтально рядом, одна из которых настроена на заполнение оставшейся доступной ширины, а другая оборачивает ее содержимое. В конкретном случае использования левый TextView
расширяется, чтобы заполнить доступное пространство.
Они помещаются либо в ограничение, либо в линейную компоновку, где каждый из них может динамически изменять свое содержимое, что требует больше места. Они оба поддерживают многоточие в конце, так что они правильно обозначают, если они сокращены.
Цель состоит в том, чтобы TextView
, ширина которого автоматически рассчитывалась на основе оставшегося доступного пространства, не удалялась из макета, обрезалась или перекрывалась другим TextView
. Теперь это происходит с использованием ConstraintLayout
или LinearLayout
в случае, если TextView
, охватывающий его содержимое, имеет значительную ширину.
Код:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/textView2"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:singleLine="true"
android:ellipsize="end"
android:background="@android:color/holo_orange_dark"
android:textSize="32dp"
android:text="Left"
/>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/textView"
app:layout_constraintEnd_toEndOf="parent"
android:singleLine="true"
android:ellipsize="end"
android:background="@android:color/holo_blue_bright"
android:textSize="32dp"
android:text="1234567890 (1) 123456789 (2)"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/textView3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:singleLine="true"
android:ellipsize="end"
android:background="@android:color/holo_orange_dark"
android:textSize="32dp"
android:text="Left"
/>
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="end"
android:background="@android:color/holo_blue_bright"
android:textSize="32dp"
android:text="1234567890 (1) 123456789 (2)"
/>
</LinearLayout>
</LinearLayout>
Код выше представляет следующую раскладку:
-^^^^^^^^^^^^^^^-------------------------------------
| Left TextView | Right TextView |
-^^^^^^^^^^^^^^^-------------------------------------
| Left TextView | Right TextView |
-^^^^^^^^^^^^^^^-------------------------------------
Одна вертикаль LinearLayout
, обернутая ConstraintLayout
и горизонтальная LinearLayout
, каждая из которых имеет одинаковое содержимое - вышеупомянутые две стороны рядом TextView
с. Левые TextView
s занимают оставшуюся доступную ширину, а правые обертывают свое содержимое, где последние намеренно установлены в приведенном выше примере, чтобы быть больше по ширине, чем ширина родительского элемента. Вот результат:
Кажется, что разрешение View
расширяться и занимать оставшееся пространство - это нож с двумя лезвиями: этот параметр также позволяет сжатию View
ниже размера его содержимого. Здесь логический обходной путь для левого TextView
для поиска - это что-то относительно минимальной ширины. Единственный макет, который позволяет решить эту проблему, даже не полностью, используя аналогичную настройку, это ConstraintLayout
. Добавляем следующую строку:
app:layout_constraintWidth_min="wrap"
к атрибутам слева TextView
в ConstraintLayout
, приводит к следующему интерфейсу:
Странное поведение здесь состоит в том, что как будто половина ширины расширяемого TextView
установлена как отрицательное горизонтальное поле слева и справа от ConstraintLayout
. Процент ширины левого TextView
, заданного как отрицательное горизонтальное поле, всегда одинаков независимо от ширины содержимого левого TextView
:
Иногда случается, что это соотношение культур отличается от 50%.
Любые идеи, как разместить две однострочные TextView
по горизонтали, так, чтобы правая выровнена по правому краю, левая могла занимать оставшееся пространство и невозможно уменьшить ее до размера его содержимого или какого-либо другого разумный размер?