如何在约束布局1.1中使用新功能?

Rom*_*man 20 android android-constraintlayout

有谁知道如何在约束布局1.1中使用新功能,即障碍和基于百分比的维度?绝对没有在线提供的文档,最近关于设计器工具的Google I/O讨论仅详细介绍了占位符.顺便说一句,我发现了如何使用组,这也是一个新功能.你需要简单地添加

<android.support.constraint.Group
    app:constraint_referenced_ids="button1, button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
Run Code Online (Sandbox Code Playgroud)

到您的约束布局,其中app:constraint_referenced_ids是一个字符串,您应该枚举要与该组关联的逗号分隔的视图ID.现在,切换组的可见性会更改其引用的所有视图的可见性,我认为这是此功能的主要目的.

Rap*_*kle 30

更新:Constraint Layout 1.1.0的正式版本终于来了,包含官方文档!


首次提出这个问题时,新功能的文档非常缺乏.我能找到的最好的就是这篇Reddit帖子!但是那里的信息给了我足够的提示来创建一个带有水平障碍的约束布局.它实际上工作,并且新的(beta)约束布局也解决了一些不好的问题wrap_content.我对Constraint Layout Beta的第一印象非常积极,已经进行了大量的额外测试.

在使用新内容之前,请添加ConstraintLayout 1.1.0到项目中.

app/build.gradle中,将约束布局依赖关系更改为:

implementation 'com.android.support.constraint:constraint-layout:1.1.0'

您可能还需要将maven存储库添加到项目的build.gradle(这是一个不同的文件,位于项目的根目录中).查找allprojects存储库部分并添加:maven { url 'https://maven.google.com' }所以整个部分看起来应该是这样的:

allprojects {
     repositories {
         jcenter()
         maven { url 'https://maven.google.com' }
     }
}
Run Code Online (Sandbox Code Playgroud)

现在为有趣的东西!以下代码段创建一个水平障,使bottom_textview低于两个included_layoutmultiline_textview.

<android.support.constraint.Barrier
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/barrier1"
    app:barrierDirection="bottom"
    app:constraint_referenced_ids="included_layout, multiline_textview" />

<TextView
    android:id="@+id/bottom_textview"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/barrier1"
    android:layout_width="0dp"
    android:layout_height="wrap_content" />
Run Code Online (Sandbox Code Playgroud)

第一印象:障碍很棒!我的新布局更平坦,更简单,似乎仍然完全符合我的要求.这绝对值得一试.

更详细的文档逐渐可用:

@Vyacheslav A的答案也很好地总结了新功能的用途.


Vya*_*v A 18

1.百分比尺寸

宽度为0dp(或match_constraint)的窗口小部件的默认行为是可扩展的(可通过layout_constraintWidth_default属性进行配置).在ConstraintLayout 1.0.x中,我们可以选择将其更改为wrap,而在1.1.x中,我们有一个新值percent,它允许我们设置一个小部件以占用一定百分比的可用空间.

    <!-- the widget will take 40% of the available space -->
    app:layout_constraintWidth_default="percent"
    app:layout_constraintWidth_percent="0.4"
Run Code Online (Sandbox Code Playgroud)

2.障碍

从这个新的小部件,我们有一些来自ConstraintLayout.com的例子.障碍将避免一个或多个小部件绕过障碍.当发生这种情况时,屏障将自行移动,并避免将小部件放置在其上方.在下面的示例中,text1和text2的end属性都不能绕过Barrier.发生这种情况时,屏障会自动向右移动(如果在RTL布局中则向左移动).在处理不同的小部件大小时,这是特别少,取决于某些配置或国际化.

<android.support.constraint.ConstraintLayout...>
  <TextView
    android:id="@+id/text1" ... />
  <TextView
    android:id="@+id/text2" ... />
  <android.support.constraint.Barrier
    android:id="@+id/barrier"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:barrierDirection="end" <!-- start, top, bottom, right... -->
    app:constraint_referenced_ids="text1,text2" />
  <TextView
    android:id="@+id/text3"
    ...
    app:layout_constraintStart_toEndOf="@+id/barrier" />
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

3.小组

像指南一样,组是大小为0的小部件.但是Group有助于将一些操作应用于一组小部件.最常见的情况是控制窗口小部件集合的可见性.处理此场景时,最常见的解决方案是在Activity或Fragment中维护自己的一个列表或一组视图,甚至添加ViewGroup并将所有视图放在其中,从而控制容器的可见性.现在,您只需要将它们的ID添加到组,组就会将操作传播到所有插入的视图.

<android.support.constraint.ConstraintLayout ...>
  <TextView
    android:id="@+id/text1" ... />
  <TextView
    android:id="@+id/text2" ... />
  <android.support.constraint.Group
    android:id="@+id/group"
    ...
    app:constraint_referenced_ids="text1,text2" />
</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果我们打电话

group.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

然后text1和text2将获得可见性GONE.

原文在这里.

官方文档在这里描述.