android - ConstraintLayout 行为从 1.1.2 到 1.1.3 的奇怪变化

标签 android android-constraintlayout

我注意到从 1.1.2 到 1.1.3 的 ConstraintLayout 行为有一个奇怪的变化,这会导致很多布局问题。另外,我个人认为这是一个bug,因为这个行为应该是不正确的。

检查以下布局:

<android.support.constraint.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/test1_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="test1"
    app:layout_constraintTop_toTopOf="@id/test2_btn"
    app:layout_constraintBottom_toBottomOf="@id/test2_btn"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toStartOf="@id/test2_btn"
    app:layout_constraintHorizontal_chainStyle="spread_inside"
    app:layout_constraintHorizontal_bias="1"/>

<Button
    android:id="@+id/test2_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="test2"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@id/test1_btn"/>
</android.support.constraint.ConstraintLayout>

以下是此布局在 ConstraintLayout1.1.21.1.3 中的呈现方式:

enter image description here

现在我们将 android:visibility="gone" 添加到 test1_btn。在ConstraintLayout版本1.1.2中,布局渲染如下:

enter image description here

这是完全合乎逻辑的,因为我们设置了 app:layout_constraintHorizo​​ntal_bias="1",所以 test2_btn 应该位于最右边链。现在如果我们使用 ConstraintLayout 版本 1.1.3,布局将呈现如下:

enter image description here

究竟发生了什么?为什么我失去了链偏见?

最佳答案

要在仍然使用版本 1.1.3 的同时获得旧行为,请将此属性添加到您的 <ConstraintLayout>标签:

app:layout_optimizationLevel="direct|barrier"

引入了 ConstraintLayout 库的 1.1 版 new optimizations .这些优化会解析您的 ConstraintLayout 并寻找可以删除或简化的约束。

从版本 1.1.2 开始,默认启用的唯一优化是直接障碍。版本 1.1.3 还有 enables chain by default .您可以通过手动指定应启用哪些优化来返回到 1.1.2 行为。


为了证明这是真正的问题,我尝试在使用 1.1.2 版时启用链优化。

第一个屏幕截图是使用版本 1.1.2 和您发布的布局(添加了 android:gone 属性)截取的。然后我将此属性添加到根 ConstraintLayout标签:

app:layout_optimizationLevel="chains"

现在我看到了您在 1.1.3 版中发现的相同行为:

关于android - ConstraintLayout 行为从 1.1.2 到 1.1.3 的奇怪变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53477887/

相关文章:

android - 4.4 中的 SEAndroid

java - 自动查找和裁剪相关图像区域

android - 约束布局的未知行为

android - ConstraintLayout 源代码在哪里?

android - Android 应用程序上的 PayPal 捐款

android - 将目录添加到 Android 中的资源文件夹

android - 无法在 ICS 中添加首选项

android - 使用 Motion Layout KeyPosition 时链接文件资源失败

android - 约束布局问题java.lang.AssertionError : TOP

android - 为什么要选择约束布局,因为我们已经有了相对布局?