android中?attr/**与@drawable/**或@color/**等的区别及用法
Posted 安静的Sunny
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android中?attr/**与@drawable/**或@color/**等的区别及用法相关的知识,希望对你有一定的参考价值。
前言
今天在写一个Demo,研究主题的时候,遇到了【?attr/colorPrimary】这个用法,由于网上都是千篇一律的回答,所以我只能硬着头皮去看源码了,茶壶煮饺子,暂且记下来,作为备忘录吧。
一、?attr/**
这个Google把它叫做“预定义样式”,字面意思就是“预先定义好的样式”。也就是相当于给这个样式定义一个变量,随后是可以进行赋值的。
用的最多的场景就是自定义控件了,比如我现在需要自定义一个控件,要求它的字体颜色是可以动态修改的。此时,我们可以这样做:
- 第一步:在attrs.xml中声明一个属性:
<declare-styleable name="SunnyAttr">
</declare-styleable>
- 第二步:指定属性的名字及 属性值的类型
<declare-styleable name="SunnyAttr">
<attr name="sunnyTextColor" format="reference"/>
<attr name="sunnyTextColorWhite" format="color"/>
</declare-styleable>
属性值 的类型有以下几种:
- reference: 指参考指定Theme中的资源ID(比如:@string/test)
- color:指颜色值(比如:#FFFF0000)
- boolean: 布尔值(比如:true)
- dimension:尺寸(比如:100dp)
- float:浮点型(比如:0.3)
- integer:整型(比如:1)
- string:字符串
- fraction:百分数(比如:100%)
- flag:或运算(比如:0x10 | 0x11)
- enum:枚举
。
- 第三步:由于从源码里面窥探出,attr/是跟随Theme来变化的,因此我们可以定义一个继承自android系统某一主题的主题样式:
<style name="SunnyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
- 第四步:在自定义主题里面,再定义一个供外面调用的属性名,并赋值:
<style name="SunnyTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!--定义一个供外面引用的属性名,并赋值-->
<item name="sunnyTextColorRed">@color/sunnyTextColorYellow</item>
</style>
- 第五步:最后我们在xml中使用自定义控件的自定义属性时,就可以为它赋值了:
<com.smartbracelet.sunny.sunnydemo3.SunnyTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="设置界面"
app:sunnyTextColor="?attr/sunnyTextColorRed"
/>
二、@color,@drawable
说完?attr/,再看@color与@drawable,后面2个是我们平时最常用的,就是指定资源,不是动态的,不会随着主题变化
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:text="红色"
android:textColor="@color/sunnyTextColorRed"
/>
以上,就是?attr/与@color,@drawable的一个小总结。。。。
以上是关于android中?attr/**与@drawable/**或@color/**等的区别及用法的主要内容,如果未能解决你的问题,请参考以下文章
Android 多主题切换 (theme + style) 及 selector/drawable 无法引用 ?attr 属性的问题
Android开发小技巧-动态设置Drawable与Tint