Android ConstraintLayout:如何在大小不同的两个按钮之间居中放置文本
我正在制作一个包含“取消”按钮、标题和最后一个“保存”按钮的标题对话框。参见图。标题约束在按钮之间。然而,当按钮中的一个比另一个长时,标题被移动到一边,因为它被告知要停留在按钮之间。p> 如何使标题视图居中于拖动控制柄下方,同时使其在不重叠按钮的情况下一直展开到按钮 谢谢 删除文本视图的约束按钮,并将文本视图约束设置为布局的左侧和右侧Android ConstraintLayout:如何在大小不同的两个按钮之间居中放置文本,android,android-constraintlayout,Android,Android Constraintlayout,我正在制作一个包含“取消”按钮、标题和最后一个“保存”按钮的标题对话框。参见图。标题约束在按钮之间。然而,当按钮中的一个比另一个长时,标题被移动到一边,因为它被告知要停留在按钮之间。p> 如何使标题视图居中于拖动控制柄下方,同时使其在不重叠按钮的情况下一直展开到按钮 谢谢 删除文本视图的约束按钮,并将文本视图约束设置为布局的左侧和右侧 <?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.wi
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="wrap_content">
<Button
android:id="@+id/button"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="ButtonButtonButtonButtonButtonButtonButtonButton"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="wTextViewTextViewTextViewTextViewTextViewTextViewTextVwTextViewTextView
TextViewTextViewTextViewTextViewTextVwTextViewTextViewTextViewTextViewTextViewTextView
TextVwTextViewTextViewTextViewTextViewTextViewTextViewTextVTextViewTextViewTextViewTextView
TextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextView
TextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/button2"
app:layout_constraintStart_toEndOf="@+id/button"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
没有固定的按钮大小
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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="wrap_content">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_weight="1"
android:text="ButtonButtonButtonButtonButtonButtonButtonButton"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="wTextViewTextViewTextViewTextViewTextViewTextViewTextVwTextViewTextView
TextViewTextViewTextViewTextViewTextVwTextViewTextViewTextViewTextViewTextViewTextView
TextVwTextViewTextViewTextViewTextViewTextViewTextViewTextVTextViewTextViewTextViewTextView
TextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextView
TextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/button2"
app:layout_constraintStart_toEndOf="@+id/button"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_weight="1"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
您的拖动手柄似乎位于布局的中心。因此,您可以将标题与父按钮的左侧和右侧关联。但如果标题和取消按钮文本过长,仍然可能出现重叠 文本视图
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
取消按钮
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/your_text_view_id"
app:layout_constraintStart_toEndOf="@id/your_text_view_id"
app:layout_constraintEnd_toEndOf="parent"
保存按钮
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/your_text_view_id"
app:layout_constraintStart_toEndOf="@id/your_text_view_id"
app:layout_constraintEnd_toEndOf="parent"
这样,您的按钮可以自由展开,而不会在屏幕中央重叠文本。这是唯一一种可以设置标题而不会在屏幕中央重叠的方法 在不可见模式下,使一个临时按钮与长按钮相同
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">
<Button
android:id="@+id/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="long cancel"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="long cancel"
android:visibility="invisible"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="save"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/txt"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/black"
android:gravity="center"
android:padding="@dimen/_10sdp"
android:text="title"
android:textColor="@color/white"
app:layout_constraintLeft_toRightOf="@id/btn1"
app:layout_constraintRight_toLeftOf="@id/btn3"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
我只是在三个按钮上实现了相同的功能,它们水平对齐,彼此不重叠。
请按照下面的方法创建视图
<Button
android:id="@+id/btnExit"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_1"
android:background="@drawable/bluebtn_gradient_rectangle"
android:text="@string/exit"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btnMemoryPreview"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tvFill" />
<Button
android:id="@+id/btnMemoryPreview"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_1"
android:background="@drawable/bluebtn_gradient_rectangle"
android:text="@string/user_memory_preview"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/UserMemoryWrite"
app:layout_constraintStart_toEndOf="@+id/btnExit"
app:layout_constraintTop_toBottomOf="@+id/tvFill" />
<Button
android:id="@+id/UserMemoryWrite"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/dp_1"
android:background="@drawable/bluebtn_gradient_rectangle"
android:text="@string/rfid_write"
android:textColor="@android:color/white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/btnMemoryPreview"
app:layout_constraintTop_toBottomOf="@+id/tvFill" />
您可以将标题相对于拖动手柄居中,但不能在“取消”和“保存”按钮之间展开文本视图。我认为两者不能同时进行 您可以使用下面的代码将标题置于拖动手柄的中心
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">
<View
android:id="@+id/view"
android:layout_width="@dimen/dp_80"
android:layout_height="@dimen/dp_8"
android:layout_marginTop="@dimen/dp_8"
android:background="@color/divider"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_8"
android:text="title"
android:textSize="@dimen/sp_24"
android:textAlignment="center"
app:layout_constraintEnd_toEndOf="@id/view"
app:layout_constraintStart_toStartOf="@id/view"
app:layout_constraintTop_toBottomOf="@id/view" />
<Button
android:id="@+id/cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="cancel"
android:textSize="@dimen/sp_16"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/title"
app:layout_constraintTop_toBottomOf="@id/view" />
<Button
android:id="@+id/save"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="save"
android:textSize="@dimen/sp_16"
app:layout_constraintStart_toEndOf="@id/title"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/view" />
</androidx.constraintlayout.widget.ConstraintLayout>
好的,受你的一些回答启发,我开始研究指导原则。其想法是使用两条指导线,视图的每侧各一条,并将父对象到指导线的距离设置为最大按钮的宽度加上任何边距。最终代码如下所示:
val biggestWidth = if (cancelButton.width > saveButton.width) {
cancelButton.width + cancelButton.marginStart
} else {
saveButton.width + saveButton.marginEnd
}
guidelineRight.setGuidelineEnd(biggestWidth)
guidelineLeft.setGuidelineBegin(biggestWidth)
标题居中于两条准则之间
请注意,此宽度计算必须在布置视图后进行。使用view.doOnLayout{}
并从那里调用您的计算。这将如何克服op提到的关于标题“让它一直扩展到按钮而不重叠它们”的问题在上面的图片标题将不会重叠,按钮将调整,请用一个长标题和一个长文本按钮更新图片,告诉我们你的意思。有趣!在没有固定大小的按钮的情况下,这能做到吗?是的。它可以用固定的尺寸来完成。检查更新的图像和代码块标题将展开或按钮将展开?标题应向上展开直到按钮参见下面的我的答案如果你说自己,重叠仍将发生:/I我不知道这将如何工作。是的,标题将在父项中居中,但按钮将位于屏幕的中间,如果长,标题将与按钮重叠:/将一条垂直的指南
放在文本视图的开头,另一条放在末尾。然后将视图约束到参考线。创建两个隐藏按钮并添加逻辑以确定其中哪一个应该最大并相应地设置大小似乎有点过火。。这是唯一的办法吗?我明白了。。我正在考虑将你的方法和GraphicStone的答案结合起来;创建隐藏的拖动控制柄,该控制柄的约束方式与使用两个隐藏按钮的约束方式相同。我会试着回到你身边。