Android自定义attr的各种坑
作者:xueshanhaizi 发布时间:2023-07-12 06:11:50
在开发Android应用程序中,经常会自定义View来实现各种各样炫酷的效果,在实现这吊炸天效果的同时,我们往往会定义很多attr属性,这样就可以在XML中配置我们想要的属性值,以下就是定义属性值可能遇到的各种坑。
大家都知道怎么定义attr属性,一般如下:
<declare-styleable name="Sample">
<attr name="custom" format="string|reference" />
</declare-styleable>
先声明一个styleable名称,name名称最好见名知义,一个styleable里面可以有多个attr属性,每一个attr都含有一个name,同时需要指明所能赋值的类型,这是是依靠format来定义的。定义好之后就可以在自定义View中使用,来实现各种吊炸天的效果,使用如下:
xml中使用:
<com.sample.ui.widget.Custom
android:id="@+id/custom_view"
android:layout_width="130dp"
android:layout_height="130dp"
android:layout_gravity="center_horizontal"
android:layout_marginTop="90dp"
app:text="@string/custom_desc"
/>
记得声明 xmlns:app=”http://schemas.android.com/apk/res-auto”, app 可以随便取名
代码中获取值:
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.Sample);
String value = a.getString(R.styleable.Sample.custom);
a.recycle();
根据format不同,还有getDimension,getColor等方式获取值。
上面只是描述了一般定义的方式,但他不是今天的主题,今天的主题是可能遇到的各种坑:
1:项目中只包含一个attr.xml,出现 Attribute “custom” has already been defined,参考链接
<declare-styleable name="Sample">
<attr name="custom" format="string|reference" />
</declare-styleable>
<declare-styleable name="Sample1">
<attr name="custom" format="string|reference" />
</declare-styleable>
如上声明了两个styleable,同时包含了相同的属性custom,这时在编译时会提示Attribute “xxx” has already been defined,表示相同属性重复定义,相同styleable name不能再同一个attr.xml中重复定义,styleable name不一致attir也不能重复定义,attr format属性不影响重复定义结果。因此可以采用如下方法解决该问题:
a:重命名相同属性名,将其中一个改为不同的名字
b:提取重复定义attr,作为公共属性,方式如下:
<attr name="custom" format="string|reference" />
<declare-styleable name="Sample">
<attr name="custom" />
</declare-styleable>
<declare-styleable name="Sample1">
<attr name="custom" />
</declare-styleable>
2: 项目中引用了多个外部项目,出现 Attribute “custom” has already been defined
不同的导入项目中,可能包含多个attr.xml,这样在定义时极有可能重复定义,他又分为如下两种情况:
a: 主项目,引用库包含同名styleable name,如:
主项目:
<declare-styleable name="Sample">
<attr name="custom" />
</declare-styleable>
引用库:
<declare-styleable name="Sample">
<attr name="custom" />
</declare-styleable>
这种情况下,编译是不会出现错误的,可以正常编译。
b: 主项目,引用库包含不同名styleable,但是有同名attr,如;
主项目:
<declare-styleable name="Sample">
<attr name="custom" />
</declare-styleable>
引用库:
<declare-styleable name="Sample1">
<attr name="custom" />
</declare-styleable>
编译时会出现 Attribute “custom” has already been defined。由此可以得出,在项目中引用各种库,模块时,各个不同的模块定义attr,要遵循以下规则,
1:全部不能重复定义,全部不能重复很难实现,不同的团队,不同的产品是极有可能重复定义,因此该方式很难实现。
2:各个不同模块,定义时加上模块前缀,这种方式重复几率就小很多,编译时再将重复的重命名就ok了。


猜你喜欢
- 1.情景展示java发送get请求、post请求(form表单、json数据)至另一服务器;可设置HTTP请求头部信息,可以接收服务器返回c
- C#查看堆栈通常是在异常处理中,出现异常之后通过异常的堆栈可以很方便的得到出现这个错误的代码调用路径。这个很有用,是否可以在没有异常出现时使
- 半路开始看的朋友可以回顾一下前几篇java并发编程专题(一)----线程基础知识java并发编程专题(二)----如何创建并运行java线程
- 使用简单的fragment实现左侧导航,供大家参考,具体内容如下先上效果图:MainActivity.javapublic class Ma
- 这篇文章主要介绍了SpringBoot项目没有把依赖的jar包一起打包的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一
- A-PC端:1-页面--multiple是控制单张还是多张图片上传<input id="BusRoute" typ
- 这篇文章主要介绍了Spring如何在一个事务中开启另一个事务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 本文章向大家介绍JAVA爬取天天基金网数据,主要包括JAVA爬取天天基金网数据使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参
- 概述从今天开始, 小白我将带大家开启 Java 数据结构 & 算法的新篇章.字符串匹配字符串匹配 (String Matching)
- Java Exception 捕获和显示实例详解 在进行Java B/S架构开发时,经常有这样的场景:后端处理业务逻辑,前端负责
- 本文实例讲述了Android开发实现模仿微信小窗口功能。分享给大家供大家参考,具体如下:运用方法:将显示窗口的风格 设置为对话框风格即可具体
- 这篇文章主要介绍了Spring Boot项目维护全局json数据代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- 1.基本语法key: value;kv之间有空格大小写敏感使用缩进表示层级关系缩进不允许使用tab,只允许空格缩进的空格数不重要,只要相同层
- 在做2048这个游戏时,因为菜单页面还能查看游戏规则,而这些规则又不在同一个页上,所以需要滑动页面实现页面切换,但是仅仅使用unity提供的
- 本文实例为大家分享了unity实现文字滚动效果的具体代码,供大家参考,具体内容如下效果:代码:using System.Collection
- 一、匹配字符串正则1//正则1 Regex r = new
- 第一个System.Runtime.InteropServices.Marshal.ReleaseComObject(sheets);&nb
- Java 用对方http接口得到返回数据如图所示我们这里自己写一个接口作为访问地址,返回的是json字符串首先我们在浏览器访问这个接口的地址
- Spring Data JPA 映射VO/DTO对象在项目开发中,时常需要根据业务需求来映射VO/DTO对象(这两个概念理解感觉很模糊- 。
- 1、需求 在Java项目中,需要读取resource资源目录下的文件,以及遍历指定资源目