无法在约束布局中居中按钮
Can't center button in constraint layout
这个问题可能已经被问了一百万次,看起来微不足道,但在阅读了大约 100 个答案后,我仍然不明白其背后的逻辑。
我有这个超级简单的布局XML
<?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="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
根据我的理解,如果我设置相反的约束,渲染引擎会自动将它们解释为百分比...我的意思是对吗?
如果没有设置特定的边距或任何东西,那么它会平衡距离。这显然意味着按钮应该在视图内居中。但它没有....
我不明白。我想以 WITHOUT SETTING A MARGIN 为中心,因为根据我的理解,边距是独立于约束的。它在约束范围内工作。但尽管如此,我还是在每边设置了 50 的边距。一旦在相对侧设置了边距,引擎应自动将其呈现为百分比....对吗?
所以这个 XML:
<?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="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginLeft="50dp"
android:layout_marginTop="50dp"
android:layout_marginEnd="50dp"
android:layout_marginRight="50dp"
android:layout_marginBottom="50dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
应该说类似“约束是 50% 到左上右上和下”之类的话,这基本上又恰好是中间。当然这又是行不通的。引擎将其解释为绝对值,按钮处于另一个尴尬的位置:
那么怎么做呢??
我不想做的事:
使用某种准则或偏差对其进行调整。
我要简单的东西
只有 4 个约束(xml 内的 4 行)和一个位于任何设备屏幕中间的按钮。
也许有人可以分享一些见解?
您应该删除这两个属性:
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintVertical_bias="0.0"
如您所见 official reference,默认偏差为五五十 (50% = 0.5)。
For example the following will make the left side with a 30% bias
instead of the default 50%, such that the left side will be shorter,
with the widget leaning more toward the left side (Fig. 5):
这个问题可能已经被问了一百万次,看起来微不足道,但在阅读了大约 100 个答案后,我仍然不明白其背后的逻辑。
我有这个超级简单的布局XML
<?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="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
根据我的理解,如果我设置相反的约束,渲染引擎会自动将它们解释为百分比...我的意思是对吗? 如果没有设置特定的边距或任何东西,那么它会平衡距离。这显然意味着按钮应该在视图内居中。但它没有....
我不明白。我想以 WITHOUT SETTING A MARGIN 为中心,因为根据我的理解,边距是独立于约束的。它在约束范围内工作。但尽管如此,我还是在每边设置了 50 的边距。一旦在相对侧设置了边距,引擎应自动将其呈现为百分比....对吗?
所以这个 XML:
<?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="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="50dp"
android:layout_marginLeft="50dp"
android:layout_marginTop="50dp"
android:layout_marginEnd="50dp"
android:layout_marginRight="50dp"
android:layout_marginBottom="50dp"
android:text="Button"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
应该说类似“约束是 50% 到左上右上和下”之类的话,这基本上又恰好是中间。当然这又是行不通的。引擎将其解释为绝对值,按钮处于另一个尴尬的位置:
那么怎么做呢??
我不想做的事: 使用某种准则或偏差对其进行调整。
我要简单的东西 只有 4 个约束(xml 内的 4 行)和一个位于任何设备屏幕中间的按钮。
也许有人可以分享一些见解?
您应该删除这两个属性:
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintVertical_bias="0.0"
如您所见 official reference,默认偏差为五五十 (50% = 0.5)。
For example the following will make the left side with a 30% bias instead of the default 50%, such that the left side will be shorter, with the widget leaning more toward the left side (Fig. 5):