分享一种 ConstraintLayout 让TextView 自适应的同时,还不超出限制范围的方式

news2024/11/27 0:16:18

分享一种 ConstraintLayout 让TextView 自适应的同时,还不超出限制范围的方式

不知道大家有没有遇到这种布局需求:
在这里插入图片描述
上图布局很简单,ImageView + 中间的TextView + View + ImageView,需求是中间的 TextView 宽度需要根据内容来展示,但长度超出屏幕时,需要将 TextView 进行…的折叠展示,同时它后面的 View 和 ImageView 不能被推出屏幕。

当TextView 超长时:
在这里插入图片描述
这种需求看起来简单,但暗藏玄机。需要注意的有两点:

  1. TextView 后面的两个 View,要跟随 TextView 的宽度。
  2. TextView 和它后面的两个 View 宽度加起来超出屏幕时,对 TextView 进行折叠,它后面的 View 和 ImageView 不受影响。

这种需求下,常规方案是达不到效果的。
你可能会想到父布局用 LinearLayout,并将 TextView 的宽度设置成 weight ,但这种方案不能满足上面的第一条,因为宽度是一直撑满的。效果是这样:
在这里插入图片描述

使用父布局使用 ConstraintLayout ,并用它的一些常规约束,可能会不满足上面的第二条,造成下面的效果(跟随的View 被顶出屏幕):
在这里插入图片描述
或者在 Java 代码中,拿到 TextView 可用宽度,并设置成它的 maxWidth,这种方案虽然可行,但实现起来还是比较复杂。我还是希望在 xml 布局中就能表达出这种约束关系。

解决方案:

方案一:

主要属性:

  • app:layout_constrainedWidth=“true”:是否强制约束
  • app:layout_constraintHorizontal_bias=“0.0”:布局相对横向约束空间的位置百分比

源代码:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:padding="16dp">

  <ImageView
    android:id="@+id/product_seller_avatar"
    android:layout_width="16dp"
    android:layout_height="16dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:background="@color/common_red" />

  <TextView
    android:id="@+id/product_seller_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="3dp"
    android:ellipsize="end"
    android:maxLines="1"
    android:textColor="#999"
    android:textSize="11dp"
    app:layout_constrainedWidth="true"
    app:layout_constraintEnd_toStartOf="@+id/point"
    app:layout_constraintStart_toEndOf="@+id/product_seller_avatar"
    app:layout_constraintTop_toTopOf="parent"
    tools:text="诗酒趁年华诗酒趁年华诗酒趁年华诗酒趁年华诗酒趁年华诗酒趁年华诗酒趁年华" />

  <View
    android:id="@+id/point"
    android:layout_width="2dp"
    android:layout_height="2dp"
    android:layout_marginStart="6dp"
    android:background="@drawable/vector_level_manager"
    app:layout_constraintStart_toEndOf="@+id/product_seller_name"
    app:layout_constraintTop_toTopOf="parent" />

  <ImageView
    android:id="@+id/product_group_shop_level_icon"
    android:layout_width="12dp"
    android:layout_height="12dp"
    android:layout_marginStart="6dp"
    android:src="@drawable/vector_level_manager"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toEndOf="@+id/point"
    app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

需要注意的是,TextView 后面跟随的 View 数量一定要大于1,否则 TextView 和 View 会形成链,从而导致下面这种情况:
在这里插入图片描述

方案二:

主要属性:

  • app:layout_constraintWidth_default=“wrap”:仅在需要时扩展视图以适应其内容,但如有约束条件限制,视图仍然可以小于其内容。因此,它与使用 Wrap Content 之间的区别在于,将宽度设为 Wrap Content 会强行使宽度始终与内容宽度完全匹配;而使用 layout_constraintWidth_default 设置为 wrapMatch Constraints 时,视图可以小于内容宽度。
  • app:layout_constraintHorizontal_chainStyle=“packed”:横向链风格,将链中元素居中在链条的中心
  • app:layout_constraintHorizontal_bias=“0.0”

源代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:padding="16dp">

  <ImageView
    android:id="@+id/product_seller_avatar"
    android:layout_width="16dp"
    android:layout_height="16dp"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:background="@color/common_red" />

  <TextView
    android:id="@+id/product_seller_name"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="3dp"
    android:ellipsize="end"
    android:maxLines="1"
    android:textColor="#999"
    android:textSize="11dp"
    app:layout_constraintEnd_toStartOf="@+id/point"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintHorizontal_chainStyle="packed"
    app:layout_constraintStart_toEndOf="@+id/product_seller_avatar"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintWidth_default="wrap"
    tools:text="诗酒趁年华诗酒趁年华诗酒趁诗酒趁年华诗酒趁年华诗酒趁诗酒趁年华诗酒趁年华诗酒趁诗酒趁年华诗酒趁年华诗酒趁" />

  <View
    android:id="@+id/point"
    android:layout_width="2dp"
    android:layout_height="2dp"
    android:layout_marginStart="6dp"
    android:background="@drawable/vector_level_manager"
    app:layout_constraintEnd_toStartOf="@+id/product_group_shop_level_icon"
    app:layout_constraintStart_toEndOf="@+id/product_seller_name"
    app:layout_constraintTop_toTopOf="parent" />

  <ImageView
    android:id="@+id/product_group_shop_level_icon"
    android:layout_width="12dp"
    android:layout_height="12dp"
    android:layout_marginStart="6dp"
    android:src="@drawable/vector_level_manager"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@+id/point"
    app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

与方案一相反,这种方案一定需要 TextView 和它后面的 View 形成横向的链,才能生效。

最后

ConstraintLayout 非常强大,它更多的属性可以参考:https://developer.android.com/training/constraint-layout?hl=zh-cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenMLDB 实时引擎性能测试报告

OpenMLDB 提供了一个线上线下一致性的特征平台。其中&#xff0c;为了支持低延迟高并发的在线实时特征计算&#xff0c;OpenMLDB 设计实现了一个高性能的实时 SQL 引擎。本报告覆盖了 OpenMLDB 实时 SQL 引擎的性能测试&#xff0c;包含了在较为复杂的负载、典型配置下的各种性…

多线程知识笔记(四)-----volatile、wait方法、notify方法

文章目录1、volatile关键字2、volatile和synchronized对比3、wait和notify方法1、volatile关键字 先看例子&#xff1a; class Counter {public int flag 0; }public class Test4{public static void main(String[] args) {Counter counter new Counter();Thread t1 new Th…

如何使用Footrace 钱包监控功能和设置自定义的交易警报

2022-06-12 本文将介绍如何使用 Footrace 监控 CEX 的钱包地址并设置自定义警报。 什么是 Footrace&#xff1f; Footrace (Foot Trace) 是一个多链的钱包追踪监控平台&#xff0c;可以监控CEX、DEX、鲸鱼、聪明钱、或任何你想关注的地址的钱包。 Footrace 帮助投资者保护他…

有了这几个软件安全测试工具,编写安全测试报告再也不愁

软件的安全是开发人员、测试人员、企业以及用户共同关心的话题&#xff0c;尤其是软件产品的使用者&#xff0c;因为系统中承载着用户的个人信息、人际互动、管理权限等各类隐私海量关键数据。软件安全测试工作不仅是为了用户&#xff0c;更牵扯到许多的利益共同体。因此软件安…

2854-40-2,环二肽cyclo(Pro-Val)

Component of coffee flavor 咖啡香精成分 在烘焙咖啡中检测到Cyclo(Pro-Val)和其他含pro的二酮哌嗪类化合物。这些化合物的含量随着烘焙强度的增加而增加&#xff0c;它们增加了苦味。这种味道苦涩的环二肽也在可可、巧克力、牛肉和奶酪等其他食品中被检测到。Cyclo(Pro-Val)显…

Linux物理内存管理——会议室管理员如何分配会议室

之前学习了站在内存的角度去看内存&#xff0c;看到的都是虚拟内存&#xff0c;这些虚拟内存总是要映射到物理页面的&#xff0c;这一篇文章来学习物理内存是如何管理的。 物理内存的组织方式 之前学习虚拟内存的时候&#xff0c;当涉及物理内存的映射的时候&#xff0c;总是…

不会还有人不知道如何搭建【关键字驱动自动化测试框架】吧 ?

前言 这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架&#xff0c;它也被称为表格驱动测试或者基于动作字的测试。关键字驱动的框架的基本工作是将测试用例分成四个不同的部分。首先是测试步骤&#xff0…

MobileNet网络模型(V1,V2,V3)

MobileNet网络中的亮点&#xff1a;DW卷积&#xff0c;增加了两个超参数&#xff0c;控制卷积层卷积核个数的α&#xff0c;控制输入图像大小的β&#xff0c;这两个超参数是我们人为设定的&#xff0c;并不是学习到的。BN batch normal批规范化&#xff0c;为了加快训练收敛速…

大数据MapReduce学习案例:数据去重

文章目录一&#xff0c;案例分析&#xff08;一&#xff09;数据去重介绍&#xff08;二&#xff09;案例需求二&#xff0c;案例实施&#xff08;一&#xff09;准备数据文件&#xff08;1&#xff09;启动hadoop服务&#xff08;2&#xff09;在虚拟机上创建文本文件&#xf…

大数据MapReduce学习案例:TopN

文章目录一&#xff0c;案例分析&#xff08;一&#xff09;TopN分析法介绍&#xff08;二&#xff09;案例需求二&#xff0c;案例实施&#xff08;一&#xff09;准备数据文件&#xff08;1&#xff09;启动hadoop服务&#xff08;2&#xff09;在虚拟机上创建文本文件&#…

linux把乱码文件(非文件内容)删除(Xshell中使用rz命令上传文件出现乱码,删除乱码文件)的步骤讲解

我的场景是&#xff1a;首先安装lrzsz&#xff1a;yum install lrzsz&#xff0c;然后后使用rz -be上传文件出现乱码问题&#xff0c;想要把乱码文件删除 圆圈圈出来的就是乱码文件&#xff0c;横线划线出来的是使用rm命令删除但是无效 解决方法是&#xff1a;ls | grep -v ‘…

人人都是数据分析师

一.耳熟能详的数据你真的了解吗&#xff1f; 1.数据的类型 根据数据的存储形式&#xff0c;可以将数据分为结构化数据和非结构化数据两种类型 存储在数据库中的结构化数据能够很方便地进行检索、分析以及展示分析结果。结构化数据是进 行数据分析的基本类型&#xff0c;大多数…

【1697. 检查边长度限制的路径是否存在】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个 n 个点组成的无向图边集 edgeList &#xff0c;其中 edgeList[i] [ui, vi, disi] 表示点 ui 和点 vi 之间有一条长度为 disi 的边。请注意&#xff0c;两个点之间可能有 超过一条边 。 给…

(附源码)springboot建达集团公司平台 毕业设计 141538

springboot建达集团公司平台 摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由于现在网络的发…

DAMOYOLO:基于DAMOYOLO训练数据集详细教程

前段时间yolov7的推出引起一篇热潮&#xff0c;接着rmyolo紧跟潮流&#xff0c;后面阿里的达摩院也推出了自己的yolo算法&#xff0c;怎么说呢&#xff0c;damoyolo推出依旧不少天了&#xff0c;现在才写博客&#xff0c;因为damoyolo给我的体验感不是很好。 先看下DAMOYOLO的…

安科瑞模拟信号隔离器BM-DIS/I 经2000V隔离输出DC4-20mA 二线制

安科瑞 王晶淼/刘芳 1.信号隔离器功能 BM系列模拟信号隔离器可以对电流、电压等电量参数或温度、电阻等非电量参数进行高速精确测量&#xff0c;经隔离转换成标准的模拟信号输出。既可直接与指针表、数显表相接&#xff0c;也可以与自控仪表&#xff08;如PLC&#xff09;、各…

nginx负载均衡实战练习

1、简介 nginx是一个web服务器&#xff0c;反向代理服务器、开源并且高性能&#xff0c;社区里面有很多工程师在维护这个项目。可以在官网&#xff08;Index of /download/&#xff09;下载组件。而且nginx可以用来做流量转发&#xff0c;也是是负载均衡功能&#xff0c;分散单…

160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后…

富而喜悦一年一渡专属于你的特别的礼物!快来收!

过去的一年&#xff0c;你过得怎么样&#xff1f;是否有过艰难的逆流时刻&#xff0c;是否拥有过快乐和满足&#xff0c;又是否得到了成长和收获&#xff1f;富而喜悦2023一年一渡财富流新年主题活动就要给你一个礼物多多&#xff01;美美的“礼物”活动&#xff01; 为此&…

虹科分享 | 虹科Dimetix激光测距传感器如何利用反射来测量?(上)

-01-测量原理 ● 反射调制激光 采用激光振幅的高频调制&#xff0c;并评估这些调制的高频信号(脉冲串)的相位和距离。激光束在短间隔内被放大调制&#xff0c;这使得它能够非常迅速地测量单个脉冲包的与距离有关的时间偏移&#xff0c;而且还能测量单个波在调制包内相互之间的…