Android: два однострочных TextView рядом - сжатие и / или обрезка любого - PullRequest
0 голосов
/ 29 мая 2019

Вариант использования: две однострочные 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 занимают оставшуюся доступную ширину, а правые обертывают свое содержимое, где последние намеренно установлены в приведенном выше примере, чтобы быть больше по ширине, чем ширина родительского элемента. Вот результат:

enter image description here

Кажется, что разрешение View расширяться и занимать оставшееся пространство - это нож с двумя лезвиями: этот параметр также позволяет сжатию View ниже размера его содержимого. Здесь логический обходной путь для левого TextView для поиска - это что-то относительно минимальной ширины. Единственный макет, который позволяет решить эту проблему, даже не полностью, используя аналогичную настройку, это ConstraintLayout. Добавляем следующую строку:

app:layout_constraintWidth_min="wrap"

к атрибутам слева TextView в ConstraintLayout, приводит к следующему интерфейсу:

enter image description here

Странное поведение здесь состоит в том, что как будто половина ширины расширяемого TextView установлена ​​как отрицательное горизонтальное поле слева и справа от ConstraintLayout. Процент ширины левого TextView, заданного как отрицательное горизонтальное поле, всегда одинаков независимо от ширины содержимого левого TextView:

enter image description here

Иногда случается, что это соотношение культур отличается от 50%.

Любые идеи, как разместить две однострочные TextView по горизонтали, так, чтобы правая выровнена по правому краю, левая могла занимать оставшееся пространство и невозможно уменьшить ее до размера его содержимого или какого-либо другого разумный размер?

1 Ответ

0 голосов
/ 06 июня 2019

Я прочитал ваш код. Вы использовали ConstraintLayout в качестве родителя и два текстовых представления внутри него.в вашем коде какая-то небольшая проблема.Вы установили ширину текстового представления 0dp, но не установили вес любого типа, поэтому вид не установлен в соответствии с вашими требованиями.

установите вес, чтобы установить горизонтальный вид двух текстов

какэто:

<TextView
                android:id="@+id/textView3"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight=".5"
                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="0dp"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:layout_weight=".5"
                android:ellipsize="end"
                android:background="@android:color/holo_blue_bright"
                android:textSize="32dp"
                android:text="1234567890 (1) 123456789 (2)"
                />

попробуйте полный код

<?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">
        <android.support.constraint.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_constraintHorizontal_weight=".5"
                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="0dp"
                android:layout_height="wrap_content"
                app:layout_constraintHorizontal_weight=".5"
                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)" />
        </android.support.constraint.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=".5"
                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="0dp"
                android:layout_height="wrap_content"
                android:singleLine="true"
                android:layout_weight=".5"
                android:ellipsize="end"
                android:background="@android:color/holo_blue_bright"
                android:textSize="32dp"
                android:text="1234567890 (1) 123456789 (2)"
                />
        </LinearLayout>
    </LinearLayout>
...