在 ConstraintLayout 中对齐视图,无需裁剪
Align views right in ConstraintLayout without clipping
我正在创建一个对话框,其中两个按钮相对于父 ConstraintLayout 右对齐。
一切都很好,直到按钮的文本变得很长。当一个或两个按钮的文本很长时,按钮会超出父按钮的边界,导致文本被剪裁,如下图所示。我想处理文本较长的情况。
即期望的行为是
- 当文本很长时按钮应该换行
- 按钮应保持在父级边界内并服从父级填充
- 按钮应保持在父级右侧对齐
当按钮文本很短时,布局会按预期工作:
当按钮文字较长时:
- 当取消按钮文本很长时,取消文本会被截断。发生这种情况是因为按钮本身被推过父级的边界。
- 当 ok 按钮的文本很长时,再次取消推到父边界之外的文本,因为按钮被推到父边界之外。
布局代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/dialog_padding"
android:paddingLeft="@dimen/dialog_padding"
android:paddingRight="@dimen/dialog_padding"
android:paddingTop="@dimen/dialog_padding">
<TextView
android:id="@+id/dialog_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dialog_text_margin"
tools:text="Dialog title" />
<TextView
android:id="@+id/dialog_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dialog_text_margin"
app:layout_constraintTop_toBottomOf="@id/dialog_title"
tools:text="Dialog text content" />
<Button
android:id="@+id/cancel_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toStartOf="@id/ok_btn"
app:layout_constraintTop_toBottomOf="@id/dialog_content"
tools:text="Dismiss" />
<Button
android:id="@+id/ok_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/dialog_content"
tools:text="Accept" />
</android.support.constraint.ConstraintLayout>
我尝试过但无济于事的事情:
- 将
app:layout_constraintStart_toStartOf="parent"
添加到取消按钮会导致按钮不再正确对齐,因此解决方案不正确
- 将关闭按钮的结尾限制在接受按钮的开头会导致按钮不再右对齐
- 对按钮使用
layout_width="0dp"
,使用 app:layout_constrainedWidth="true"
无效
这是我认为您正在尝试完成的两个屏幕截图。
首先,用一些简短的文字:
现在有一些长文本:
我对布局进行了一些调整,并在按钮被限制为宽度的 33% 处引入了一条准则。您没有指定按钮可以水平扩展多少,所以我做了这个假设。
此布局的 XML 如下。我将按钮的宽度设置为 0dp
或 match_constraints
以便调整它们的大小。这些按钮也被放置在一个 packed
链中,将两个按钮组合在一起。水平偏差现在设置为 0.5
,但如果它开始向左移动,增加它会将组向右移动。
ConstraintLayout
documentation 对这些功能及其使用方法有一些很好的描述。
<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.33" />
<TextView
android:id="@+id/dialog_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dialog_text_margin"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Dialog title" />
<Button
android:id="@+id/cancel_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toStartOf="@+id/ok_btn"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@+id/guideline"
app:layout_constraintTop_toBottomOf="@+id/dialog_title"
tools:text="Dismiss" />
<Button
android:id="@+id/ok_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/cancel_btn"
app:layout_constraintTop_toTopOf="@+id/cancel_btn"
tools:text="Accept" />
我正在创建一个对话框,其中两个按钮相对于父 ConstraintLayout 右对齐。
一切都很好,直到按钮的文本变得很长。当一个或两个按钮的文本很长时,按钮会超出父按钮的边界,导致文本被剪裁,如下图所示。我想处理文本较长的情况。
即期望的行为是
- 当文本很长时按钮应该换行
- 按钮应保持在父级边界内并服从父级填充
- 按钮应保持在父级右侧对齐
当按钮文本很短时,布局会按预期工作:
当按钮文字较长时:
- 当取消按钮文本很长时,取消文本会被截断。发生这种情况是因为按钮本身被推过父级的边界。
- 当 ok 按钮的文本很长时,再次取消推到父边界之外的文本,因为按钮被推到父边界之外。
布局代码
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/dialog_padding"
android:paddingLeft="@dimen/dialog_padding"
android:paddingRight="@dimen/dialog_padding"
android:paddingTop="@dimen/dialog_padding">
<TextView
android:id="@+id/dialog_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dialog_text_margin"
tools:text="Dialog title" />
<TextView
android:id="@+id/dialog_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dialog_text_margin"
app:layout_constraintTop_toBottomOf="@id/dialog_title"
tools:text="Dialog text content" />
<Button
android:id="@+id/cancel_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toStartOf="@id/ok_btn"
app:layout_constraintTop_toBottomOf="@id/dialog_content"
tools:text="Dismiss" />
<Button
android:id="@+id/ok_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/dialog_content"
tools:text="Accept" />
</android.support.constraint.ConstraintLayout>
我尝试过但无济于事的事情:
- 将
app:layout_constraintStart_toStartOf="parent"
添加到取消按钮会导致按钮不再正确对齐,因此解决方案不正确 - 将关闭按钮的结尾限制在接受按钮的开头会导致按钮不再右对齐
- 对按钮使用
layout_width="0dp"
,使用app:layout_constrainedWidth="true"
无效
这是我认为您正在尝试完成的两个屏幕截图。
首先,用一些简短的文字:
现在有一些长文本:
我对布局进行了一些调整,并在按钮被限制为宽度的 33% 处引入了一条准则。您没有指定按钮可以水平扩展多少,所以我做了这个假设。
此布局的 XML 如下。我将按钮的宽度设置为 0dp
或 match_constraints
以便调整它们的大小。这些按钮也被放置在一个 packed
链中,将两个按钮组合在一起。水平偏差现在设置为 0.5
,但如果它开始向左移动,增加它会将组向右移动。
ConstraintLayout
documentation 对这些功能及其使用方法有一些很好的描述。
<android.support.constraint.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.33" />
<TextView
android:id="@+id/dialog_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dialog_text_margin"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Dialog title" />
<Button
android:id="@+id/cancel_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintEnd_toStartOf="@+id/ok_btn"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toEndOf="@+id/guideline"
app:layout_constraintTop_toBottomOf="@+id/dialog_title"
tools:text="Dismiss" />
<Button
android:id="@+id/ok_btn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/cancel_btn"
app:layout_constraintTop_toTopOf="@+id/cancel_btn"
tools:text="Accept" />