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

时间:2017-05-20 19:26:50

标签: 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"/>

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

4 个答案:

答案 0 :(得分:29)

更新:An official release of Constraint Layout 1.1.0终于来了,complete with official documentation!

首次提出这个问题时,

Documentation新功能非常缺乏。我能找到的最好的是this Reddit post!但是那里的信息给了我足够的提示来创建一个带有水平障碍的约束布局。它确实有效,新的(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' }
     }
}

现在有趣的东西!以下代码段会创建横向障碍,因此bottom_textview低于included_layout和{{1} }}

multiline_textview

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

更详细的文档逐渐可用:

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

答案 1 :(得分:18)

<强> 1。百分比维度

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

    <!-- the widget will take 40% of the available space -->
    app:layout_constraintWidth_default="percent"
    app:layout_constraintWidth_percent="0.4"

<强> 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>

第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>

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

group.setVisibility(View.GONE);

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

原始text here

description here.

的官方文档

答案 2 :(得分:1)

有一些关于障碍here的信息。

答案 3 :(得分:1)

这是official doc,它完美地解释了约束布局1.1中添加的所有新功能

群组需要注意的另一件事是,如果您将视图作为参考ID在群组中显示,则其个人可见性将无效,为此,您需要创建一个单独的集团为它。 如果我错了,请纠正我。 以下是使用群组的示例代码,您可以在此处看到 view1的可见性,因为它已分配给群组,因此无效。

    <?xml version="1.0" encoding="utf-8"?>
    <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">

    <android.support.constraint.Group
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="visible"
        app:constraint_referenced_ids="view1,view2" />

    <View
        android:id="@+id/view1"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@android:color/black"
        android:visibility="gone"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

    <View
        android:id="@+id/view2"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@android:color/darker_gray"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view1" />

    <View
        android:id="@+id/view3"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@android:color/holo_blue_light"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view2" />

    <View
        android:id="@+id/view4"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:background="@android:color/holo_red_light"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view3" />

</android.support.constraint.ConstraintLayout>

现在要克服这一点,我们可以创建一个新组来处理view1的可见性,如下所示。

<android.support.constraint.Group
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       app:constraint_referenced_ids="view1" />

这是我遇到的解决方法,如果有这样的场景我们想要处理群组的可见性以及个别视图在不同情况下的可见性。