Поместите TextView рядом с другим TextView для более длинного текста на Android - PullRequest
1 голос
/ 20 марта 2019

Моя цель - иметь 2 TextView с (textLeft, textRight) рядом друг с другом.textLeft должен быть выровнен по левой стороне родителя.textRight всегда должно быть непосредственно справа от textLeft (не в крайнем правом углу устройства), и его не следует выталкивать из экрана, если textLeft слишком длинное.

Горизонтальное LinearLayoutздесь бесполезно, так как использование весов будет фиксировать размер вида, а это нежелательно.

Я использовал этот RelativeLayout, который отлично работает, если textLeft не слишком длинный.С более длинными текстами textRight отталкивается от экрана.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".TextAlignActivity">

    <TextView
            android:id="@+id/textLeft"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp"
            android:maxLines="3"
            android:ellipsize="end"
            android:text="Text On the Left - long random text to follow"
    />

    <TextView
            android:id="@+id/textRight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toEndOf="@+id/textLeft"
            android:layout_alignParentRight="true"
            android:textSize="10sp"
            android:maxLines="1"
            android:text="Text on the Right"
    />

</RelativeLayout>

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

РЕДАКТИРОВАТЬ:

  1. InЧтобы упростить мой запрос, я использую 2 TextView s в примере.В моем приложении код textLeft является вертикальным LinearLayout с 2 TextViews (textLeftTop и textLeftBottom) вместо одного TextView, как показано в примере.Я надеюсь, что решение, которое работает для 2 TextViews, должно также работать для LinearLayout и TextView.

  2. Основываясь на решениях до сих пор, я должен уточнить, что мне нужноtextRight должен быть справа от textLeft (не для устройства), если textLeft не длинная.Если textLeft длинное, то textRight должно «прилипать» к устройству вправо, а textLeft должно переносить текст.

Ответы [ 3 ]

1 голос
/ 20 марта 2019

Изменить:

Этот макет является своего рода "чатом". Вы можете использовать два LinearLayout, один из которых является родительским для match_parent, а другой - два TextView. Обратите внимание, что последний имеет wrap_content ширина.

layout_weight атрибут LinearLayout означает ... грубо говоря, важно меньшее число.

Смотри также: https://developer.android.com/reference/android/widget/LinearLayout

<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

    <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="test test test test test test test test test test test test test test test"
                android:layout_weight="1"/>

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello world"
                android:layout_weight="0"/>
    </LinearLayout>

    <Space android:layout_width="wrap_content" android:layout_height="20dp"/>

    <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="test test test test test test test test "
                android:layout_weight="1"/>

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello world"
                android:layout_weight="0"/>
    </LinearLayout>

</LinearLayout>

устаревший ответ

Обратите внимание, что textLeft имеет ширину 0dp.

Если вы установите ширину (или высоту) в 0 в макете ограничения, это означает, что он заполнит оставшуюся часть пустого пространства.

Или, вы можете использовать app:layout_constraintHorizontal_weight с шириной 0dp, вы можете установить процент от ширины макета.

<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">

    <TextView
            android:id="@+id/textLeft"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:text="Long Long Long Long Long Long Long Long Long Long Long Long Long"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toLeftOf="@id/textRight"
            app:layout_constraintTop_toTopOf="parent"/>

    <TextView
            android:id="@+id/textRight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!  "
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toRightOf="@id/textLeft"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>
0 голосов
/ 21 марта 2019

вы можете реализовать этот код следующим образом

<android.support.constraint.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="match_parent">

<TextView
    android:id="@+id/textLeft"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="10sp"
    android:maxLines="3"
    android:ellipsize="end"
    android:text="Text On the Left - long random text to follow"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"/>

<TextView
    android:id="@+id/textRight"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toEndOf="@+id/textLeft"
    android:layout_alignParentRight="true"
    android:textSize="10sp"
    android:maxLines="1"
    android:text="Text on the Right"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintEnd_toEndOf="parent"  />

или тот

<android.support.constraint.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="match_parent">

<TextView
    android:id="@+id/textLeft"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="10sp"
    android:maxLines="3"
    android:ellipsize="end"
    android:text="Text On the Left - long random text to follow"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    android:layout_margin="10dp"/>

<TextView
    android:id="@+id/textRight"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toEndOf="@+id/textLeft"
    android:layout_alignParentRight="true"
    android:textSize="10sp"
    android:maxLines="1"
    android:text="Text on the Right"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintStart_toEndOf="@id/textLeft"
    android:layout_margin="10dp"/>

0 голосов
/ 20 марта 2019
    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text1ldksjdaskldjadlkjdaslkdjsl"
        android:textSize="20sp"
        app:layout_constraintEnd_toStartOf="@id/text2"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/text2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="text2dsjdakldjlkajdlskdjasldkjdlskdjasdlaskdjasldkj"
        android:textSize="20sp"
        android:gravity="right"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/text1"
        app:layout_constraintTop_toTopOf="parent" />


</android.support.constraint.ConstraintLayout>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...