我注意到从 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>
以下是此布局在 ConstraintLayout
的 1.1.2
和 1.1.3
中的呈现方式:
现在我们将 android:visibility="gone"
添加到 test1_btn
。在ConstraintLayout
版本1.1.2
中,布局渲染如下:
这是完全合乎逻辑的,因为我们设置了 app:layout_constraintHorizontal_bias="1"
,所以 test2_btn
应该位于最右边链。现在如果我们使用 ConstraintLayout
版本 1.1.3
,布局将呈现如下:
究竟发生了什么?为什么我失去了链偏见?
最佳答案
要在仍然使用版本 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/