andorid自定义attr的各种坑(代码片段)

zyfd zyfd     2023-01-03     567

关键词:

本文来自网易云社区

作者:孙有军


在开发Andorid应用程序中,经常会自定义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了。


网易云免费体验馆,0成本体验20+款云产品!

更多网易研发、产品、运营经验分享请访问网易云社区


相关文章:
【推荐】 初步探索前端性能测试
【推荐】 HBase原理–所有Region切分的细节都在这里了
【推荐】 硬盘任性丢数据,但分布式存储一定可靠吗?








andorid自定义view-自定义属性基础(代码片段)

当我们自定义View的时候,至少要定义两个构造函数。publicCustomView(Contextcontext)this(context,null);publicCustomView(Contextcontext,AttributeSetattrs)super(context,attrs);init(context,attrs);第二个构造函数中的参数attrs可以获取在xml中添加的属性的值。... 查看详情

andorid自定义view-自定义属性基础(代码片段)

当我们自定义View的时候,至少要定义两个构造函数。publicCustomView(Contextcontext)this(context,null);publicCustomView(Contextcontext,AttributeSetattrs)super(context,attrs);init(context,attrs);第二个构造函数中的参数attrs可以获取在xml中添加的属性的值。... 查看详情

andorid自定义view-自定义属性基础(代码片段)

当我们自定义View的时候,至少要定义两个构造函数。publicCustomView(Contextcontext)this(context,null);publicCustomView(Contextcontext,AttributeSetattrs)super(context,attrs);init(context,attrs);第二个构造函数中的参数attrs可以获取在xml中添加的属性的值。... 查看详情

andorid自定义view-自定义属性-属性重复导致冲突(代码片段)

先来看一个自定义属性重复的例子:attrs.xml<resources><declare-styleablename="View1"><attrname="title_color"format="color"/></declare-styleable><dec 查看详情

andorid自定义view-自定义属性-属性重复导致冲突(代码片段)

先来看一个自定义属性重复的例子:attrs.xml<resources><declare-styleablename="View1"><attrname="title_color"format="color"/></declare-styleable><declare-styleablename="View2"><attrname="title_... 查看详情

java用于andorid的自定义适配器(代码片段)

查看详情

微个小程序,自定义tabbar踩坑纪要(代码片段)

自定义tabbar 有很多坑,比如:wx.showTabBarRedDot(Objectobject)显示tabBar某一项的右上角的红点。wx.showTabBar(Objectobject)tabBar显示文本数字这两个API 我就死活显示不出来...后台也没报错. 估计因为自定义本身就没做好原因...所以,... 查看详情

android——自定义view(代码片段)

自定义View画一个实心圆效果图创建attrs.xml文件初始化样式属性支持Padding属性支持wrap_content属性布局文件中的应用画一个带外圆环的圆效果图创建attrs.xml文件初始化样式属性内圆与外圆环的绘制布局文件中的应用画一个外圆环可... 查看详情

logrotate自定义切割时间的一些坑(代码片段)

转:https://www.echoxu.cn/logrotate/#logrotate介绍说起日志切割,很多人会选择用crontab脚本定时执行已编写好的日志分割脚本,殊不知在linux上内置了日志分割工具,它就是logrotate且其在centos7上默认安装了.logrotate介绍logrotate是基于crond服务... 查看详情

cudahalf编程的各种坑(代码片段)

...。理想虽好,现实却比较骨感,在实际中会遇到各种坑,最终的结果却是不一定有收益,下面把自己在用half编程中踩过的坑记录一下。1.half编程和计算能力密切相关half编程要求GPU的计算能力要大于等于5.3,这... 查看详情

自定义view之小细节(代码片段)

1.构造方法自定义属性ImageButtonWithText名字与自定义View名字一致,attr的名字要与其他自定义View的attr名字不同,不然会报错<declare-styleablename="ImageButtonWithText"><attrname="text_img"format="string"/>... 查看详情

android自定义滑动解锁view(代码片段)

✏️丨自定义滑动解锁View1.需求如下:近期需要做一个类似屏幕滑动解锁的功能,右划开始,左划暂停。2.需求效果图如下3.实现效果展示4.自定义view如下/***Desc自定义滑动解锁View*AuthorZY*Mailsunnyfor98@gmail.com*Date2021/5/... 查看详情

android自定义滑动解锁view(代码片段)

✏️丨自定义滑动解锁View1.需求如下:近期需要做一个类似屏幕滑动解锁的功能,右划开始,左划暂停。2.需求效果图如下3.实现效果展示4.自定义view如下/***Desc自定义滑动解锁View*AuthorZY*Mailsunnyfor98@gmail.com*Date2021/5/... 查看详情

自定义view之小细节(代码片段)

1.构造方法自定义属性ImageButtonWithText名字与自定义View名字一致,attr的名字要与其他自定义View的attr名字不同,不然会报错<declare-styleablename="ImageButtonWithText"><attrname="text_img"format= 查看详情

安卓自定义view(代码片段)

attrs.xml详解我们在使用组件属性的时候经常会使用android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="减少分数"这些都是系统属性,我们通过attrs.xml可以自己定义属性<?xmlv 查看详情

签发token校验token多方式登录签发token的实现自定义认证反爬规则的认证类admin使用自定义user表:新增用户密码密文群查接口各种筛选组件数据准备drf搜索过滤组件drf排(代码片段)

签发token源码入口#前提:给一个局部禁用了所有认证与权限的视图类发送用户信息得到token,其实就是登录接口#1)rest_framework_jwt.views.ObtainJSONWebToken的父类JSONWebTokenAPIView的post方法#接收有username、password的post请求#2)post方法将请... 查看详情

recyclerviewitemdecoration自定义高度和颜色(代码片段)

自定义高度和颜色RecyclerViewItemDecoration自定义RecyclerViewItemDecoration,针对RecyclerView的横向和竖向的分割线,具体特点如下支持像ListView一样可以使用颜色作为分隔线(也支持drawable)支持自定义分割线的高度支持控... 查看详情

recyclerviewitemdecoration自定义高度和颜色(代码片段)

自定义高度和颜色RecyclerViewItemDecoration自定义RecyclerViewItemDecoration,针对RecyclerView的横向和竖向的分割线,具体特点如下支持像ListView一样可以使用颜色作为分隔线(也支持drawable)支持自定义分割线的高度支持控... 查看详情