无法在约束布局中居中按钮

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):