#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, предпочтительнее.