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

#java #android #android-layout #android-linearlayout #android-view

Вопрос:

Поведение, которое я ищу, приведено ниже. Представьте, что скобки [] имеют одинаковый размер max_width .

  1. когда text1 и text2 в сочетании меньше max_width , скажем, 100dp:

    [text1short text2short —пустое пространство— ]

  2. когда text1 и text2 в сочетании больше , чем max_width , text1 имеет эллиптический размер:

    [text1sho… text2loooooooooooooooong]

Вот что у меня есть до сих пор, и это работает, но есть ли способ использовать только один макет для достижения этой цели?

 <FrameLayout
      android:id="@ id/container"
      android:layout_width="@dimen/max_width"
      android:layout_height="@dimen/some_height">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="horizontal">

      <TextView
          android:id="@ id/text1"
          android:layout_width="0dp"
          android:layout_height="match_parent"
          android:layout_weight="1"
          android:ellipsize="end"
          android:maxLines="1" />

      <TextView
          android:id="@ id/text2"
          android:layout_width="wrap_content"
          android:layout_height="match_parent"
          android:maxLines="1"/>

    </LinearLayout>
</FrameLayout>
 

Комментарии:

1. Я бы посоветовал разобраться в ConstraintLayout этом и Guidelines для этого.

Ответ №1:

ConstraintLayout-это правильный путь. Ниже приведен макет, который делает то, что вам нужно. В этот макет включены некоторые ключевые концепции ограничения, такие как цепочки и рекомендации. Цепочка с виджетом ограниченной ширины является ключевой. Руководство менее важно для этого макета и является просто способом ограничить, насколько далеко могут распространяться текстовые представления.

 <androidx.constraintlayout.widget.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@ id/tvLeft"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="8dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="Short left view."
        android:textColor="@color/black"
        android:textSize="20sp"
        app:layout_constrainedWidth="true"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@ id/tvRight"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@ id/tvRight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginEnd="16dp"
        android:maxLines="1"
        android:text="Short right"
        android:textColor="@color/black"
        android:textSize="20sp"
        app:layout_constrainedWidth="true"
        app:layout_constraintBottom_toBottomOf="@id/tvLeft"
        app:layout_constraintEnd_toStartOf="@id/guideline"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@ id/tvLeft"
        app:layout_constraintTop_toTopOf="@id/tvLeft" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@ id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="300dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
 

Вот макет с коротким содержанием:

введите описание изображения здесь

И с длинным содержимым в левом текстовом представлении:

введите описание изображения здесь

Изображения взяты из конструктора макетов Android Studio.

Комментарии:

1. Спасибо Cheticamp, в итоге я использовал что-то очень похожее на ваше решение, но без Руководства. Я использовал макет ограничения стиля упакованной цепочки и добавил layout_constraintWidth_default=wrap текстовое поле text1, которое хорошо работало. Я нашел это в этой документации: developer.android.com/training/…

Ответ №2:

Я использовал макет ограничения стиля упакованной цепочки и добавил layout_constraintWidth_default=wrap текстовое поле text1, которое хорошо работало. Я нашел это в этой документации: https://developer.android.com/training/constraint-layout#adjust-the-view-size

   <TextView
      android:id="@ id/text1"
      android:layout_width="0dp"
      android:layout_height="@dimen/some_height"
      android:ellipsize="end"
      android:maxLines="1"
      app:layout_constraintHorizontal_weight="1"
      app:layout_constraintEnd_toStartOf="@ id/text2"
      app:layout_constraintHorizontal_bias="0"
      app:layout_constraintHorizontal_chainStyle="packed"
      app:layout_constraintWidth_default="wrap"
      app:layout_constraintStart_toEndOf="@ id/thing_on_the_left"
      app:layout_constraintTop_toTopOf="parent"/>

  <TextView
      android:id="@ id/text2"
      android:layout_width="wrap_content"
      android:layout_height="@dimen/some_height"
      android:maxLines="1"
      app:layout_constraintEnd_toStartOf="@ id/thing_on_the_right"
      app:layout_constraintStart_toEndOf="@ id/text1"
      app:layout_constraintTop_toTopOf="parent" />