Android RelativeLayout Rtl布局下的bug:paddingStart会同时作用于左右内边距

问题现象

问题示例
如上图,只是设置了paddingStart,在RTL布局下,左右都产生了10dp的间距。其他布局如LinearLayout,FrameLayout则没有这个问题。

    private void positionAtEdge(View child, LayoutParams params, int myWidth) {if (isLayoutRtl()) {// myWidth是RelativeLayout宽度(父View指定的,不是最终宽度),params.mRight是子View位置。//这里可以看出计算时已经减去了mPaddingRight(RTL布局下mPaddingRight 就是PaddingStart)// 所以这个mLeft是考虑了右边距的。params.mRight = myWidth - mPaddingRight - params.rightMargin;params.mLeft = params.mRight - child.getMeasuredWidth();} else {params.mLeft = mPaddingLeft + params.leftMargin;params.mRight = params.mLeft + child.getMeasuredWidth();}}
...if (isWrapContentWidth) {if (isLayoutRtl()) {if (targetSdkVersion < Build.VERSION_CODES.KITKAT) {width = Math.max(width, myWidth - params.mLeft);} else {// 这个width最终会参与RelativeLayout的宽度计算,这里也是包含了右边的padding的。width = Math.max(width, myWidth - params.mLeft + params.leftMargin);}} else {if (targetSdkVersion < Build.VERSION_CODES.KITKAT) {width = Math.max(width, params.mRight);} else {width = Math.max(width, params.mRight + params.rightMargin);}}
}...
if (isWrapContentWidth) {// Width already has left padding in it since it was calculated by looking at// the right of each child view// 重点是这里,上面计算的width在问题场景已经包含了右内边距,// 这里又加了一次。所以最终边距是双份的。// 从注释也能看出,原生没有考虑这种情况。width += mPaddingRight;if (mLayoutParams != null && mLayoutParams.width >= 0) {width = Math.max(width, mLayoutParams.width);}

总结:原生在进行测量时没有考虑这种情况,在计算RelativeLayout布局宽度时多加了一个paddStart,但child的位置计算(layout)并未受到影响,所以最终效果类似于既指定了paddStart又指定了paddingEnd。

解决方法

1.使用其他布局,如线性布局,帧布局,约束布局等替换。
2.使用marginStart替代paddingStart实现相同的UX效果。

问题原因

经过分析源码发现这是RelativeLayout测量布局的一个bug。

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

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

相关文章

tensorrt-llm与vllm的量化性能比较

准备部署lora微调好的语言大模型&#xff0c;有tensorrt-llm和vllm两种加速策略可选&#xff0c;而量化策略也有llm.int8&#xff0c;gptq&#xff0c;awq可用&#xff0c; 怎样的组合才能获得最佳精度与速度呢&#xff0c;这是个值得探讨的问题&#xff0c;本文以llama-factor…

代理记账公司的五大问题及其解决方案

代理记账公司是现代企业管理中不可或缺的一部分&#xff0c;它为企业的日常运营提供了专业、高效的服务&#xff0c;随着行业的发展和竞争的加剧&#xff0c;代理记账公司的面临的问题也日益突出&#xff0c;这些问题主要表现在以下几个方面&#xff1a; 业务流程不规范 许多代…

【前端】display:none和visibility:hidden两者的区别

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xff1a;洲与AI。 &#x1f913; 欢迎大家关注我的专栏&#xff0c;我将分享Web前后端开发、…

C语言 | Leetcode C语言题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; int minCut(char* s) {int n strlen(s);bool g[n][n];memset(g, 1, sizeof(g));for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i][j] (s[i] s[j]) && g[i 1][j - 1];}}int f[n];for (int i 0; i <…

YOLOv8改进 | Conv篇 | 利用YOLOv10提出的C2fUIB魔改YOLOv8(附代码 + 完整修改教程)

一、本文介绍 本文给大家带来的改进机制是利用YOLOv10提出的C2fUIB模块助力YOLOv8进行有效涨点&#xff0c;其中C2fUIB模块所用到的CIB模块是一种紧凑的倒置块结构&#xff0c;它采用廉价的深度卷积进行空间混合&#xff0c;并采用成本效益高的点卷积进行通道混合。本文针对该…

AI大数据统计《庆余年2》中的小人物有哪些?

《庆余年2》除了主角表演经常&#xff0c;每个配角小人物也很出彩。那到底有哪些小人物呢&#xff1f; 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要写一个Python脚本&#xff0c;具体步骤如下&#xff1a; 读取文档&#xff1a;"D:\qyn\…

数据结构与算法之Floyd弗洛伊德算法求最短路径

目录 前言 Floyd弗洛伊德算法 定义 步骤 一、初始化 二、添加中间点 三、迭代 四、得出结果 时间复杂度 代码实现 结束语 前言 今天是坚持写博客的第18天&#xff0c;希望可以继续坚持在写博客的路上走下去。我们今天来看看数据结构与算法当中的弗洛伊德算法。 Flo…

Leetcode3164. 优质数对的总数 II

Every day a Leetcode 题目来源&#xff1a;3164. 优质数对的总数 II 解法1&#xff1a;统计因子 遍历 nums1&#xff0c;统计所有元素的因子个数&#xff0c;记录到哈希表 cnt 中。 遍历 nums2&#xff0c;那么有 cnt[nums2[i]*k] 个数可以被 nums2[i]*k 整除&#xff0c;…

利用conda进行R的安装

1.miniconda3的安装 官网&#xff1a;Miniconda — Conda documentation 找到对应系统、Python版本下载 wget https://mirrors.ustc.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh #wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x…

信息系统项目管理师0141:产品范围和项目范围(9项目范围管理—9.1管理基础—9.1.1产品范围和项目范围)

点击查看专栏目录 文章目录 第9章 项目范围管理9.1 管理基础9.1.1 产品范围和项目范围 第9章 项目范围管理 项目范围管理包括确保项目做且只做所需的全部工作&#xff0c;以成功完成项目。项目范围管理主要在于定义和控制哪些工作应该包括在项目内&#xff0c;哪些不应该包含在…

Spring运维之boot项目开发关键之日志操作以及用文件记录日志

日志基础 日志 在企业级开发中还是比较重要的 我们来写一个日志 RestController RequestMapping("/books") public class Controller {//创建记录日志的对象private static final Logger log LoggerFactory.getLogger(Controller.class);GetMappingpublic String …

java自学阶段二:JavaWeb开发60(mybatis学习)

目录&#xff1a; 学习目标mybatis的基础用法&#xff08;新增、删除、修改、查询&#xff09; 一&#xff1a;学习目标&#xff1a; 1&#xff09;了解mybatis的基础概念&#xff1b; 2&#xff09;学会mybatis的基础用法&#xff1b; 二、mybatis的基础概念&#xff1a; M…

在Cisco Packet Tracer上配置NAT

目录 前言一、搭建网络拓扑1.1 配置PC机1.2 配置客户路由器1.3 配置ISP路由器 二、配置NAT2.1 在客户路由器中配置NAT2.2 测试是否配置成功 总结 前言 本篇文章是在了解NAT的原理基础上&#xff0c;通过使用Cisco Packet Tracer 网络模拟器实现模拟对NAT的配置&#xff0c;以加…

C++ | Leetcode C++题解之第132题分割回文串II

题目&#xff1a; 题解&#xff1a; class Solution { public:int minCut(string s) {int n s.size();vector<vector<int>> g(n, vector<int>(n, true));for (int i n - 1; i > 0; --i) {for (int j i 1; j < n; j) {g[i][j] (s[i] s[j]) &…

Jenkins+Rancher2.7部署构建

在Jenkins中使用rancher插件时需要去查找工作负载地址 在Rancher2.7没有查看Api按钮了需要自己去查找 1.进入https://192.168.x.xx:6443/v3/projects/ 2.输入在rancher中要查找的的项目名称并点击deployment连接进入下一个页面 3.找到自己的deployment随便点一个进去 4.浏览…

Nginx设置缓存后,访问网页404 问题原因及解决方案(随手记)

目录 问题描述Nginx文件 解决方案查看error_log日志问题原因修改文件并测试Nginx文件测试 总结 问题描述 在Nginx中设置缓存expires后&#xff0c;结果重启nginx&#xff0c;网站访问404了。 Nginx文件 server {listen 80;server_name bird.test.com;location / {root /app/…

Echarts 在指定部分做文字标记

文章目录 需求分析1. demo12. demo22. demo3 定位解决需求 实现在Echarts的折线图中,相同Y值的两点之间显示’abc’ 分析 1. demo1 使用 ECharts 的 markLine 功能来在相邻两个点之间添加标记。其中,我们通过设置标记的 yAxis 和 label 来控制标记的位置和显示内容。最后…

VL53L4CX TOF开发(2)----修改测距范围及测量频率

VL53L4CX TOF开发.2--修改测距范围及测量频率 概述视频教学样品申请完整代码下载测距范围测量频率硬件准备技术规格系统框图应用示意图生成STM32CUBEMX选择MCU串口配置IIC配置 XSHUTGPIO1X-CUBE-TOF1app_tof.c详细解释测量频率修改修改测距范围 概述 最近在弄ST和瑞萨RA的课程…

每日一题33:数据统计之广告效果

一、每日一题 返回结果示例如下&#xff1a; 示例 1&#xff1a; 输入&#xff1a; Ads 表: ------------------------- | ad_id | user_id | action | ------------------------- | 1 | 1 | Clicked | | 2 | 2 | Clicked | | 3 | 3 | Viewed…

系统架构设计师重难点知识脑图

大家都知道现在的软考自从变成机考后&#xff0c;越来越难了&#xff0c;教程上的内容不仅全还细&#xff0c;几乎任何内容都有可能考&#xff0c;出题老师主打一个出其不意&#xff0c;比如2024年5月考试&#xff0c;连UML时序图的片段都考&#xff0c;这 种如果看书的话一般都…