ConstraintLayout 1.1.0(测试版)中链中的边距如何工作

2024-01-22

自从切换到 ConstraintLayout 版本 1.1.0-beta4 以来,我的几个布局都崩溃了。在进行任何更改之前,我想更好地了解利润率如何运作ConstraintLayout链。下面我比较一下布局ConstraintLayout版本1.0.2到版本1.1.0-beta4,但我相信这个问题首先出现在1.1.0-beta2中。

我的目标是让一些文本视图在屏幕上延伸,并在第一个和第二个文本视图以及第二个和第三个文本视图之间留有间隙。背景应显示在这些边距中。为此,我创建一条水平链,并指定从左侧文本视图到中心文本视图的结束边距以及从中心文本视图到右侧文本视图的结束边距。水平链条样式是spread_inside.

示例 1 - 使用 ConstraintLayout 版本 1.0.2

这就是 1.0.2 版本中的情况,也是我所期望的。

<android.support.constraint.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@android:color/holo_blue_light">

    <TextView
        android:id="@+id/tvLeft"
        android:layout_width="0dp"
        android:layout_height="35dp"
        android:layout_marginEnd="8dp"
        android:background="@android:color/white"
        android:gravity="center"
        android:text="Text1"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/tvCenter"
        app:layout_constraintHorizontal_chainStyle="spread_inside"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="HardcodedText" />

    <TextView
        android:id="@+id/tvCenter"
        android:layout_width="0dp"
        android:layout_height="35dp"
        android:layout_marginEnd="8dp"
        android:background="@android:color/white"
        android:gravity="center"
        android:text="Text2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/tvRight"
        app:layout_constraintStart_toEndOf="@+id/tvLeft"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="HardcodedText" />

    <TextView
        android:id="@+id/tvRight"
        android:layout_width="0dp"
        android:layout_height="35dp"
        android:background="@android:color/white"
        android:gravity="center"
        android:text="Text3"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/tvCenter"
        app:layout_constraintTop_toTopOf="parent"
        tools:ignore="HardcodedText" />

</android.support.constraint.ConstraintLayout>

示例 2 - 使用 ConstraintLayout 版本 1.1.0-beta4

在 1.1.0-beta4 版本中,相同的布局如下所示ConstraintLayout。请注意,边距已消失。我希望这看起来应该与示例 1 相同,但事实并非如此。

示例 3 - 使用带有起始边距的 ConstraintLayout 版本 1.1.0-beta4

如果我采用相同的布局并简单地添加起始边距8dp到右侧的文本视图(tvRight),我的边距不仅重新出现在中心和右侧文本视图之间,而且还出现在左侧和中心文本视图之间,尽管我没有更改那里的边距。

这不仅仅是之前设定的利润突然得到兑现。如果我将最右侧文本视图的起始边距设置为“48dp”,那么看起来是48dp边距也出现在左侧和中心文本视图之间。

<android.support.constraint.ConstraintLayout 
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@android:color/holo_blue_light">

<!-- TextViews tvLeft & tvRight not shown but are the same as above.-->

<TextView
    android:id="@+id/tvRight"
    android:layout_width="0dp"
    android:layout_height="35dp"
    android:layout_marginStart="48dp"
    android:background="@android:color/white"
    android:gravity="center"
    android:text="Text3"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@+id/tvCenter"
    app:layout_constraintTop_toTopOf="parent"
    tools:ignore="HardcodedText" />

</android.support.constraint.ConstraintLayout>  

所以,我的问题是,“为什么我会看到这些结果?”边距是如何处理的ConstraintLayout链条,特别是spread_inside链子?连锁利润的处理方式是否发生了变化,或者我错过了什么?我正在寻找解释或参考一些解释这一切的文档。


我找不到任何文档可以对这个确切的问题给出权威的答案。然而,有一些关于边距的讨论API 文档ConstraintLayout https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html#Margins:

如果设置了侧边距,它们将应用于相应的约束(如果存在)

在链的特定实例中,每个视图之间有双向约束。也就是说,不仅视图 A 的结束受限于视图 B 的开始,而且视图 B 的开始也受限于视图 A 的结束。

在您发布的布局中,视图 A 有结束约束和结束边距,但视图 B 有开始约束,没有开始边距。据我所知,这意味着您的布局中存在冲突规则(视图 A 希望距视图 B 8dp,但视图 B 希望距视图 A 0dp)。也许不同版本的 ConstraintLayout 库有不同的策略(a)确定这是否算作冲突以及(b)如果算作冲突则解决冲突。

通过实验,以下是我如何找到在不同 ConstraintLayout 库版本上的链中工作的边距:

版本1.0.2

链中每个视图的侧边距不依赖于或影响链中的其他视图。这对行为(至少)有两个明显的影响。首先,向一个视图添加边距会将另一个视图推开相应的量,无论该视图的边距如何。其次,向一个视图添加边距不会影响链中更远的视图的边距(例如,在第一个视图上放置 8dp 的端边距本身不会导致第二个和第三个视图之间出现 8dp 的空间)。

版本1.1.0-beta4

链中每个视图的侧边距都依赖于并影响链中的其他视图。同样,这对行为有两个明显的影响。首先,向一个视图添加边距不会将另一个视图推开,除非它也具有相同数量的边距*。其次,在链的第一个和第二个视图之间添加边距也会影响链的第二个和第三个视图之间的间距**。

*:似乎 1.1.0-beta4 只允许开始边距将视图分开,而仅结束边距则没有效果。无论如何,我建议匹配边距。

**: I suspect这是因为该链试图均匀分配“空间”。视图 A 和 B 之间的边距会产生间隙,并且由于链希望强制保持一致的间距,因此它会在视图 B 和 C 之间添加类似的间隙。

例子:

精简后,这里的布局与原始布局一样,但边距略有变化。我保留所有其他属性不变。

<android.support.constraint.ConstraintLayout>

    <TextView
        android:layout_marginEnd="8dp"/>

    <TextView
        android:layout_marginStart="8dp"/>

    <TextView/>

</android.support.constraint.ConstraintLayout>

v1.0.2:

v1.1.0-beta4:

这应该说明了库版本之间的两个差异。同样,我完全无法找到解释这一切的官方文档,但仅基于实验,它似乎是正确的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ConstraintLayout 1.1.0(测试版)中链中的边距如何工作 的相关文章

  • Android 动画闪烁

    我一直在搜索关于这个主题的尽可能多的线程 我可以在处理动画监听器时在 Android 2 2 中出现的闪烁中找到这些线程 但我无法完全解决我的问题 我得到的是一个 LinearLayout 弹出框 用户触摸它可以向下移动大约 100 像素
  • EditText - 在键入时更改文本

    我需要在输入时替换 EditText 内的文本 示例 如果用户按下 A 它将被存储到缓冲区中 并在 EditText 上显示 D 看起来像是按下了 D 现在我可以读取按下的字符 但无法显示 et 中的任何字符以避免 stackoverflo
  • Android 的 MediaPlayer setSurface 在暂停状态下

    EDIT 显然这与多个活动无关 这与视频文件的编码有关 我会尝试简化问题 当我调用时 我有一个处于暂停状态的 MediaPlayer 对象mediaPlayer getCurrentPosition 我得到的结果是准确的 当我打电话时med
  • 如何从 AccountManager.getAccounts() 获取与特定帐户关联的图标

    每个帐户的帐户设置中都会显示一个图标 对于 Google 帐户有一个图标 对于 Facebook 帐户有另一个图标 有没有办法从应用程序的代码中获取该图标 最后我解决了 private Drawable getIconForAccount
  • Google 语音识别器无法在 Android 4.x 上启动

    我偶然发现了这个随机问题 这是我的代码 mSpeechRecognizer SpeechRecognizer createSpeechRecognizer mContext initializeRecognitionListener mSp
  • cordova:从 url 下载到 android 下载文件夹

    在开始之前 我尝试了以下堆栈溢出的答案 使用phonegap将文件下载到ios android下载文件夹 https stackoverflow com questions 21375624 download file to downloa
  • android-透明RelativeLayout

    我想要制作一个具有可绘制渐变作为背景的活动 并将在其背景顶部显示 4 个面板 相对布局 现在我想让 4 个面板透明 例如 50 以便也可以看到渐变背景 我搜索了谷歌 但我发现只能通过活动而不是布局来做到这一点 如何做我想做的事 您可以创建一
  • 解析 android-21 的数据失败,不支持major.minor 版本 51.0

    安装 Android 5 0 SDK 21 后在 Eclipse 中出现以下错误 Loading data for Android 5 0 has encountered a problem Parsing Data for android
  • 更改图库中的边框样式

    我正在服用this http www androidpeople com android gallery imageview example 教程 正如你所看到的this http www androidpeople com wp cont
  • 如何使用抽屉布局左侧移动主要内容

    刚刚检查了如何使用 DrawerLayout 制作菜单here http www androidhive info 2013 11 android sliding menu using navigation drawer 但左侧菜单正在移动
  • Facebook 和 google 登录不适用于 beta 测试 APK

    Google 和 Facebook 登录在 Android Studio Tools 中工作正常 但它们不适用于测试版本或 Beta 测试 因此请给我任何解决此问题的线索 联系谷歌支持后我已经解决了这个问题 以下是此问题的修复方法 请按照步
  • Android 应用程序阿拉伯语支持

    我已经按照developer android官方网站上的教程Hello L10进行操作 但没有任何关于阿拉伯语的内容 Android 应用程序要使用阿拉伯语需要执行哪些步骤 例如 用户可以使用组合框或单选按钮来选择英语或阿拉伯语 我已经这样
  • React Native 图像选择器图像上传在 iOS 上不起作用

    我在通过 fetch 和 react native image picker 将图像上传到 Multer 和 Express 后端时遇到问题 下面是我的 React Native 代码 try const data new FormData
  • listItems之间的黑线,如何删除?

    我的列表项之间有一些水平黑线 如何删除它们 我的图形没有一部分 谢谢 listview setDivider null listview setDividerHeight 0 或在 XML 中
  • SeekBar 未设置实际进度。 SetProgress() 不适用于早期的 Android 版本 [重复]

    这个问题在这里已经有答案了 我有一个应用程序 我想根据从 Web 服务检索到的值设置特定 SeekBar 的进度 但是 当我使用 SetProgress int 时 只有 SeekBar 的 搜索者 被设置 该栏未按预期 填充 它看起来是这
  • 在 WallpaperManager.ACTION_CHANGE_LIVE_WALLPAPER 处出现错误

    我正在通过以下方式创建我的第一个动态壁纸this http www vogella com articles AndroidLiveWallpaper article html教程 但我收到错误can not be resolved or
  • 横向模式下视频视图不是全屏

    我正在使用用 xml 设计的视频视图 该视频在纵向模式下为全屏 但当切换到横向模式时 它会左对齐 并且宽度和高度都会换行 而不是全屏 我参考了这些 但仍然没有解决这个问题 全屏视频视图未居中 https stackoverflow com
  • 电子邮件发不出去,短信中的链接为 404

    我们刚刚完成将 Google AppInvites 集成到我们的应用程序中 我们注意到以下问题 电子邮件不会被发送 而发送的短信会带有一个链接 显示会出现 404 页面 仅当我设置 设置其他平台目标应用程序 对于 Android 和 iOS
  • 如何从下到上连续移动图像?

    我一直在研究这个例子http obviam net index php a very basic the game loop for android http obviam net index php a very basic the ga
  • 如何获取 EC2 实例的 CloudWatch 指标数据

    我想获取我的 EC2 实例的 Cloudmetrics 数据 以便我可以使用这些数据绘制图表并将其显示在我的 Android 设备上 我怎么做 有相同的示例程序或教程吗 提前致谢 这就是我正在做的 private static void f

随机推荐

  • 我可以在 PyQt4 应用程序中嵌入绘图(离线)吗?

    我知道 plotly 会渲染为 HTML 并且可以嵌入到类似 Web 的环境中 我想知道是否可以在 PyQt 应用程序的 HTML 窗口中执行此操作 具体来说 我想知道这是否可以在没有互联网连接的情况下离线工作 EDIT 这是我最终如何使用
  • python:查找所有具有值的键

    我有一本如下字典 mydict a apple b bobb c d dog e dog 假设我想找到所有具有值 的键dog 在嵌套的情况下 键应该用点分隔 所以输出应该是一个列表 e c d 现在 如果我在 python 3 中编写以下代
  • 用于应用内购买的自动续订订阅

    通过应用内购买 自动续订 购买产品后 我点击服务器上的 API 来提供购买信息 打API如何知道产品是新的 当用户取消该订阅时 如何知道 Swift 3 为了让您检测到用户何时取消订阅 您需要执行以下操作 下载应用程序收据 验证收据 以便您
  • Networkx Python 中的权重相乘

    我正在networkx中绘制一棵树 并添加了百分比份额作为权重 示例 商店和商店的所有者 可以是另一家商店 import pandas as pd data pd DataFrame shop S1 S1 S1 S2 S2 S3 S3 S3
  • 连接 nvarchar(max) 值似乎不起作用(+= 用作=)

    使用 SQL Server 2012 我发现尝试基于表中的 nvarchar max 列构建字符串似乎无法正常工作 它似乎是覆盖 而不是追加 任意示例 DECLARE sql nvarchar max SELECT sql N SELECT
  • Powershell 全局模式匹配

    我正在看C ProgramFiles对于一个名为log4j core x y z jar 我正在尝试匹配最后一位数字z 可以是一位数也可以是两位数 0 99 我似乎无法获得正确的全局模式来完成此任务 Code PS C Users Admi
  • Greasemonkey - 替换 javascript src 以加载自定义 JS 而不是页面之一

    js 文件中有带有变量的特定网页 我想重写Greasemonkey加载的URL 但仍然没有得到任何结果 我使用的代码是 window addEventListener load function allTextareas document
  • 如何将pystache与金字塔集成?

    我想使用 pystache 在我的金字塔应用程序中提供的基于类的视图 但我不完全确定如何正确集成两者 我读了this https stackoverflow com questions 8169606 how to change the t
  • PHP 页面之间传递变量

    我想在一个页面中获取用户输入 将其存储在 php 变量中 然后在另一个 php 页面中使用它 我尝试过使用 会话 但它似乎不起作用 还有其他安全的选择吗 该信息可能是用户名和密码 尝试更改您的会话代码 因为这是执行此操作的最佳方法 例如 索
  • 使用 CSS 样式的按钮元素在 IE6 中不显示背景图像

    我有一个针对 IE 6 的旧版 Web 应用程序 正在重新设计 这些按钮的默认浏览器按钮看起来已替换为蓝色按钮图像 我的以下 HTML 和 CSS 在 IE 8 上工作正常 但在 IE 6 上不行 HTML
  • C++ 标准中的重载与默认参数

    我正在阅读另一个问题 这引起了我的思考 标准通常会指定在其描述中具有默认参数的函数 标准是否允许将它们写为重载 例如 标准规定std basic string copy有以下声明 size type copy Ch p size type
  • git pickaxe 找不到修改的行

    今天早些时候 我正在搜索更改函数名称的提交getReportHtml to getReport 我用镐找不到它 所以我通过手动搜索找到了它 现在我知道哪个提交发生了更改 我可以在 git diff 输出中看到更改 function getR
  • Aurelia:子路由器路由显示在 app.html 元素中的“主”导航栏和子视图中?

    我们想要一个侧边栏菜单和一个 主 区域 根据您的导航方式 侧边栏的菜单项将发生变化 并且新视图将加载到 主 区域 我创建了 app html
  • UIPageViewController 转换“对开始/结束外观转换的不平衡调用”

    当我浏览时UIPageViewController比我得到的过渡动画更快 Unbalanced calls to begin end appearance transitions for
  • 如何使用对象实例作为模板参数?

    我正在学习C 我有一个 Classroom 类 它应该根据正在使用的配置对象以一种或另一种方式表现 创建 Classroom 对象时 我可以在构造函数中传递该 Configuration 对象 如下所示 class Classroom pr
  • 如何通过参数化存储过程填充列表框?

    我有一个Winforms应用程序和一个employeeListBox departmentComboBox和一些文本框来显示员工信息 例如fNameTextbox lNameTextBox 我想通过departmentCombobox 选定
  • 需要资产管道中的树

    我的资产管道中有一个名为 typefaces 的文件夹 它无需任何添加即可工作application rb 在目录中 我有不同的字体类型 例如文件夹中的 eof ttf 等 如下所示 Assets Typefaces Eof files T
  • 是否可以更改 HIVE 中的分区元数据?

    这是我之前提出的问题的延伸 如何比较具有不同数据类型组的两列 https stackoverflow com questions 58240566 how to compare two columns with different data
  • 如何在路由(react-router-dom)react js中将状态从父组件传递到子组件

    我是 React js 的新手 并使用以下命令创建了一个小型反应应用程序react router dom 其中我有两个组成部分 仪表板 dashboard js 信息 information js 和一个主要组件应用程序 App js 其中
  • ConstraintLayout 1.1.0(测试版)中链中的边距如何工作

    自从切换到 ConstraintLayout 版本 1 1 0 beta4 以来 我的几个布局都崩溃了 在进行任何更改之前 我想更好地了解利润率如何运作ConstraintLayout链 下面我比较一下布局ConstraintLayout版