Положение текста в центре макета с конечной ссылкой на другой виджет

#android #layout #android-constraintlayout

#Android #макет #android-constraintlayout

Вопрос:

У меня есть виджет диалогового окна с панелью навигации, содержащий заголовок и кнопку закрытия. Я хочу поместить заголовок в центр устройства и поместить кнопку закрытия в конец макета. Однако, когда заголовок длинный, он будет перекрываться кнопкой закрытия. Вот мой код:

 <androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:maxLines="1"
        android:ellipsize="end"
        android:text="Title" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        android:text="Close" />

</androidx.constraintlayout.widget.ConstraintLayout>
  

Есть ли обходной путь для достижения этой цели?

Спасибо.

Ответ №1:

Обычно для центрирования текста вы должны ограничить начало и конец текста конечной точкой области центрирования. В этом случае, поскольку текст должен быть центрирован на экране, вы должны прикрепить начало к родительскому началу, а конец к родительскому концу. Это работает, если текст по центру не превышает пустую центральную область и не перекрывает текстовое представление «Close». К сожалению, нет способа установить эти ограничения и указать центрированному виду, чтобы избежать перекрытия TextView справа.

Чтобы заставить его работать, я бы представил другой TextView, который является дубликатом «Close» TextView, сделал его невидимым и прикрепил к началу и началу родительского элемента. Это создаст область между двумя текстовыми представлениями, где текст может быть центрирован. Чтобы текст не перекрывал конечный текстовый вид, укажите app:layout_constrainedWidth="true" в центрированном виде. Что-то вроде этого:

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

    <TextView
        android:id="@ id/space"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Close"
        android:visibility="invisible"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@ id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxLines="1"
        android:text="This is some very long text that should stretch across the device and ellipsize."
        app:layout_constrainedWidth="true"
        app:layout_constraintEnd_toStartOf="@ id/textView2"
        app:layout_constraintStart_toEndOf="@ id/space"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@ id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Close"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.constraintlayout.widget.Barrier
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="left"
        tools:layout_editor_absoluteX="306dp"
        tools:layout_editor_absoluteY="62dp" />

</androidx.constraintlayout.widget.ConstraintLayout>
  

который будет отображаться в конструкторе следующим образом для длинного текста:

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

и, как показано ниже, для короткого текста:

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

Существуют и другие способы сделать это, которые потребуют некоторого кодирования, но это решение только для XML, которое, IMO, предпочтительнее.