Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart
每次提交代码时,AS这个老妈子总爱唠叨一堆warning,这些Warning都在讲什么?

1.Use app:drawableStartCompat instead of android:drawableStart
在Android开发中,android:drawableStart和app:drawableStartCompat是两个用于设置视图(如TextView)起始位置的drawable资源的属性。它们的区别主要涉及对从右到左(RTL)支持的兼容性以及不同版本的Android系统。
-
android:drawableStart: 这个属性只在API级别17及以上(Android 4.2 Jelly Bean开始)提供原生支持。它允许你为一个视图指定一个Drawable来显示在文本的起始位置,考虑到了RTL布局方向。 -
app:drawableStartCompat: 这是AppCompat库提供的一个属性,它是一个向后兼容的版本,可以在所有API级别上工作。当使用较旧版本的Android时,app:drawableStartCompat确保RTL支持能够适当地应用。这个属性是通过支持库(Support Library或AndroidX)提供的,并且需要与AppCompat控件一起使用。
如果你不使用app:drawableStartCompat替换android:drawableStart,可能存在以下隐患:
- 缺乏向后兼容性:在API级别低于17的设备上运行时,
android:drawableStart不会被识别,因此Drawable将不会按预期出现在视图的起始位置。 - RTL支持问题:即使在新设备上,如果不使用AppCompat库,可能无法保证在使用RTL语言时,
Drawable正确地显示在文本的起始位置。
总之,推荐使用app:drawableStartCompat来确保你的应用在所有API级别上都具有良好的兼容性,特别是在处理RTL布局和支持多种语言的情况下。要使用app:drawableStartCompat属性,你需要在项目中引入并使用AppCompat库中的控件,例如AppCompatTextView代替普通的TextView。
2.When you define paddingStart’ you should probably also define ‘paddingEnd’ for right-to-left symmetry
在Android开发中,如果你为布局或视图设置了paddingStart而没有同时设置paddingEnd,可能会导致在使用从右到左(RTL)布局的语言时界面显示不一致或不对称。例如,阿拉伯语和希伯来语等语言是从右向左书写的,因此它们的布局方向也是从右到左的。
paddingStart和paddingEnd属性分别对应于视图的起始和结束边距,在LTR(从左到右)布局中,paddingStart相当于左边距,paddingEnd相当于右边距。但在RTL布局中,这两个属性的作用是颠倒的:paddingStart表示右边距,而paddingEnd表示左边距。
如果你只设置了paddingStart,则在RTL布局下视图将只有右侧的内边距,没有左侧的内边距,这可能导致布局看起来不平衡或者错位。为了确保布局在所有语言和方向下都能正确显示,最好同时设置paddingStart和paddingEnd。
例子:
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world"android:paddingStart="16dp"android:paddingEnd="16dp" />
在上面的代码中,无论用户设备的布局方向如何,文本视图两侧都有相同量的内边距,从而保证了对称性和一致性。
总结来说,如果不同时设置paddingStart和paddingEnd,就会存在以下几点隐患:
- 布局不对称:在RTL布局下,视图可能会缺少预期的边距,导致视觉不平衡。
- 多语言支持差:对于支持多种语言的应用程序,不考虑RTL布局可能会给使用RTL书写系统的用户带来糟糕的体验。
- 可维护性问题:未来如果需要添加对RTL语言的支持,可能需要返回并修复所有仅定义了
paddingStart的地方,增加了维护工作量。
说实话,上述的前两点隐患 我不太赞同,因为我试了 没问题。
3.Warning:(62, 22) Resource IDs will be non-final by default in Android Gradle Plugin version 8.0, avoid using them in switch case statements
Android开发中,资源ID(例如R.id.my_view)通常被用于识别和引用布局文件、菜单、字符串等的特定元素。在Android Gradle插件版本7.x及更早版本中,这些资源ID是final的,这意味着它们在编译时就已经确定,并且不会改变。因此,开发者可以安全地在switch语句中使用它们。
然而,Android Studio提供的警告信息表明,在未来的Android Gradle插件版本8.0中,资源ID将不再默认为final。这一变化意味着资源ID可能在运行时被修改,因此它们不能保证在编译时就已经是常量。由于switch语句要求case标签是编译时常量,这个更改将使得在switch语句中直接使用资源ID会引发编译错误。
如果你的代码中包含了类似以下的结构:
switch (view.getId()) {case R.id.view_one:// 处理view_onebreak;case R.id.view_two:// 处理view_twobreak;// 更多的case...
}
在Android Gradle插件版本8.0中,这段代码就会出问题。当资源ID不再是final时,上述代码需要重写以避免编译错误。替代的做法可能包括使用if-else语句或其他逻辑处理方式来代替switch语句:
int id = view.getId();
if (id == R.id.view_one) {// 处理view_one
} else if (id == R.id.view_two) {// 处理view_two
} // 更多的else-if...
总结一下,这个警告的隐患如下:
- 代码兼容性:未来版本的Android Gradle插件将破坏现有使用
switch语句的代码。 - 必须进行代码迁移:开发者需要在升级到新版本的插件之前更新他们的代码,以避免编译错误。
- 潜在的重构工作:对于大型项目或者广泛使用了
switch语句的代码库,这可能是一项重大的重构工作。
为了准备未来的变化,建议开发者开始从现在起避免在switch语句中使用资源ID,尤其是准备升级到Android Gradle插件版本8.0时。
详见《Android Gradle Plugin 8.0 为啥不支持Resource ID final》
相关文章:
Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart
每次提交代码时,AS这个老妈子总爱唠叨一堆warning,这些Warning都在讲什么? 1.Use app:drawableStartCompat instead of android:drawableStart 在Android开发中,android:drawableStart和app:drawableStartCompat是两个用于设置…...
C# wpf 实现任意控件(包括窗口)更多调整大小功能
WPF拖动改变大小系列 第一节 Grid内控件拖动调整大小 第二节 Canvas内控件拖动调整大小 第三节 窗口拖动调整大小 第四节 附加属性实现拖动调整大小 第五章 拓展更多调整大小功能(本章) 文章目录 WPF拖动改变大小系列前言一、添加的功能1、任意控件Drag…...
Vue+OpenLayers7入门到实战:快速搭建Vue+OpenLayers7地图脚手架项目。从零开始构建Vue项目并整合OpenLayers7.5.2
返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章针对Vue初学者,对Vue不熟悉,甚至还不会Vue的入门学生读者。 本章会详细讲解从NodeJS环境到npm环境的各个步骤,再到使用vue-cli脚手架快速生成项目,以及添加OpenLayers7地图库依赖,编写简单的xyz高德地图显示…...
mysql-线上常用运维sql
1.表备份 INSERT INTO table1 SELECT * FROM table2; 2.用一个表中的字段更新另一张表中的字段 UPDATE table2 JOIN table1 ON table2.id table1.id SET table2.column2 table1.column1; 3.在MySQL中,查询一个表的列字段值是否包含另一个表的字段,…...
Linux之进程间通信(system V 共享内存)
目录 一、共享内存 1、基本原理 2、共享内存的创建 3、共享内存的释放 4、共享内存的关联 5、共享内存的去关联 6、查看IPC资源 二、完整通信代码 三、共享内存的特点 四、信号量 1、相关概念 2、信号量概念 进程间通信的本质就是让不同的进程看到同一个资源。而前…...
数据库 sql select *from account where name=‘张三‘ 执行过程
select *from account where name张三分析上面语句的执行过程 用到了索引 由于是根据 1.name字段进行查询,所以先根据name张三’到name字段的二级索引中进行匹配查 找。但是在二级索引中只能查找到 Arm 对应的主键值 10。 2.由于查询返回的数据是*,…...
力扣日记1.27-【回溯算法篇】131. 分割回文串
力扣日记:【回溯算法篇】131. 分割回文串 日期:2023.1.27 参考:代码随想录、力扣 131. 分割回文串 题目描述 难度:中等 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可…...
如何用web界面打开华为防火墙
目录 1.创建一个虚拟网卡 2.cloud操作 3.防火墙上操作 4. 登录 1.创建一个虚拟网卡 2.cloud操作 3.防火墙上操作 4. 登录...
力扣20、有效的括号(简单)
1 题目描述 图1 题目描述 2 题目解读 给定的字符串只包含括号,判断这个字符串中的括号是否按照正确顺序出现,即这个字符串是否有效。 3 解法一:栈 C的STL中的stack,在解题时非常好用。 3.1 解题思路 使用栈stk,并枚举…...
Android 系统启动过程
当按下电源时,引导芯片代码会从预定义的地方(固化在ROM) 开始执行,加载引导程序BootLoader到RAM,然后执行。 启动内核的第一个进程idle(pid0),idle进程是Linux系统第一个进程,是init进程和kthreadd进程的父进程。 idle的主要作用 初始化进程以及内存管…...
基于STM32的智能手环设计与实现
需要原理图工程,源码,PCB工程的朋友收藏,这篇文章关注我,私我吧!!! 基于STM32的智能手环设计与实现 摘要一、研究背景及意义二、实现功能三、系统方案设计系统方案设计框图3.1 单片机芯片选择3…...
[BJDCTF2020]The mystery of ip
hint 猜测ip和XFF有关 加一个XFF 下面这一步是看了wp出来的:存在ssti 这里尝试用jinja的注入方法,页面回显了是php的smarty框架 查了一下smarty的注入方法,发现可以直接执行php命令 在根目录找到flag...
RUST笔记:candle使用基础
candle介绍 candle是huggingface开源的Rust的极简 ML 框架。 candle-矩阵乘法示例 cargo new myapp cd myapp cargo add --git https://github.com/huggingface/candle.git candle-core cargo build # 测试,或执行 cargo ckeckmain.rs use candle_core::{Device…...
Python算法题集_接雨水
本文为Python算法题集之一的代码示例 题目42:接雨水 说明:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1]…...
FIND_IN_SET的使用:mysql表数据多角色、多用户查询
MySQL 函数 FIND_IN_SET 是用于在逗号分隔的字符串中查找特定值的函数。它的语法如下: FIND_IN_SET(search_value, comma_separated_string)search_value 是要查找的值。 comma_separated_string 是逗号分隔的字符串,在这个字符串中查找指定的值。FIND_…...
JVM篇----第十一篇
系列文章目录 文章目录 系列文章目录前言一、在新生代-复制算法二、在老年代-标记整理算法三、分区收集算法四、GC 垃圾收集器前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你…...
鸿蒙HarmonyOS获取GPS精确位置信息
参考官方文档 #1.初始化时获取经纬度信息 aboutToAppear() {this.getLocation() } async getLocation () {try {const result await geoLocationManager.getCurrentLocation()AlertDialog.show({message: JSON.stringify(result)})}catch (error) {AlertDialog.show({message…...
java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数
java正则校验,手机号,邮箱,日期格式,时间格式,数字金额两位小数 3.58是否为金额:true 3.582是否为金额:false 1284789qq.com是否为email:true 1284789qq.com是否为email࿱…...
php下curl发送cookie
目录 一:使用 CURLOPT_COOKIE 选项 二:CURLOPT_COOKIEFILE 三:CURLOPT_HTTPHEADER php curl发送cookie的几种方式,下面来介绍下 一:使用 CURLOPT_COOKIE 选项 通过设置 CURLOPT_COOKIE 选项,你可以将 cookie 字符…...
stable diffusion学习笔记——文生图(一)
模型设置 基本模型 基本模型也就是常说的checkpoint(大模型),基本模型决定了生成图片的主体风格。 如上图所示,基本模型的后缀为.safetensors。需要存放在特定的文件夹下。 如果用的是启动器,可以在启动器内直接下载。…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
