一、概述

相信你已经知道,Android 可使用 XML 标签语言进行界面的定义。每个标签中有一个一个的属性,这些属性有相应的属性值。例如:

<cn.neillee.composedmenu.RotatingArcMenu
android:id="@+id/ram2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/barBgColor"
app:position="left_bottom"
app:radius="150dp"/>

有两点可以注意到:

  • 其一,在某个自定义 ViewGroup 中,有两个自定义属性 positionradius,与其他属性不同的是,这两个属性的命名空间为 app

  • 其二,系统属性 background 的属性值为 ?attr/barBgColor

二、详细介绍

2.1 自定义属性

这里介绍

app:position="left_bottom"
app:radius="150dp"

的使用。

自定义属性常见于自定义的 View 中,让我们还是以概述中的代码作为例子。自定义属性及其属性值在 /values/attr.xml 中有如下定义:

<?xml version="1.0" encoding="utf-8"?>
<resources> <attr name="position">
<enum name="left_top" value="0"/>
<enum name="left_bottom" value="1"/>
<enum name="right_top" value="2"/>
<enum name="right_bottom" value="3"/>
</attr>
<attr name="radius" format="dimension"/> <declare-styleable name="ComposedMenu">
<attr name="position"/>
<attr name="radius"/>
</declare-styleable>
</resources>

在该文件中,枚举了 position 有四个属性值,并为每个属性值提供了不同的 value 值作区分。而 radius 定义为 dimension 引用,表示其值须为 dimension 类型的值。类似地,还有如有其他类型,参考文章 【Android】Android自定义属性,attr format取值类型

接下来如何获取自定义属性值就成了关键。我在自定义 ViewGroup 中使用如下代码获取到用户在 layout 文件中,自定义 ViewGroup 标签下使用到的值。

private static final int LEFT_TOP = 0;
private static final int LEFT_BOTTOM = 1;
private static final int RIGHT_TOP = 2;
private static final int RIGHT_BOTTOM = 3; protected static final int DEFAULT_RADIUS = 150;
protected static final int DEFAULT_POSITION = RIGHT_BOTTOM; protected int mRadius; ...
public RotatingArcMenu(Context context, AttributeSet attrs, int defStyleAttr) {
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ComposedMenu, defStyleAttr, 0);
int pos = a.getInt(R.styleable.ComposedMenu_position, DEFAULT_POSITION);
mRadius = (int) a.getDimension(R.styleable.ComposedMenu_radius, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_RADIUS, getResources().getDisplayMetrics()));
a.recycle();// 使用完后记得回收
}

2.2 获取系统属性

这里介绍 android:background="?attr/barBgColor" 属性的定义与获取。

我之所以如此定义,是为了使得 背景色 能够随着应用的主题切换而变化,最简单的例子就是 夜间模式

首先,我在 values/attr.xml 文件中对 barBgColor 进行定义:

<?xml version="1.0" encoding="utf-8"?>
<resources>
...
<attr name="barBgColor" format="color"/>
</resources>

其次,在 values/styles.xml 中对该属性值进行了定义:

<resources>

    <style name="AppDayTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="barBgColor">@color/ZHIHUBlue</item>
</style>
<style name="AppNightTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="barBgColor">#263238</item>
</style>
</resources>

最后,我在控件的属性中对该属性值进行了使用

<cn.neillee.composedmenu.RotatingArcMenu
android:id="@+id/ram2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/barBgColor"
app:position="left_bottom"
app:radius="150dp"/>

需要说明的是,可以不再控件属性中使用自定义的属性值,可在代码中进行获取与设置。如:

TypedValue typedValue = new TypedValue();
mContext.getTheme().resolveAttribute(R.attr.barBgColor, typedValue, true);
mRotatingArcMenu.setBackgroundColor(typedValue.data);

这里使用到了 TypedValue 这个类。

2.3 关于 TypedValue

详细介绍见官网:

https://developer.android.com/reference/android/util/TypedValue.html

此处我仅对我在上一小节中的使用做简单介绍。在使用过程中,我观察到在不同主题下,TypedValue 读取到的值如下:

在 DayTheme 中,由于我定义的是 @color/ZHIHUBlue ,对color的引用即 resourceId。因此,typedValue.resourceId 有值,且直接等效于 R.color.ZHIHUBlue,typedValue.type=TYPE_INT_COLOR_RGB8,表示 typedValue.data 有值,为8位的颜色代码值(#rrggbb)。

在 NightTheme 中,由于我定义的是 #263238,颜色代码值。因此,TypedValue.resourceId 无值,但 typedValue.type=TYPE_INT_COLOR_RGB8,表示 typedValue.data 有值,为8位的颜色代码(#rrggbb)。

此文在我的 Github Pages 上同步发布,地址为:Android-属性自定义及使用获取浅析

Android 属性自定义及使用获取浅析的更多相关文章

  1. Android读取自定义View属性

    Android读取自定义View属性 attrs.xml : <?xml version="1.0" encoding="utf-8"?> < ...

  2. Android属性allowBackup安全风险浅析

    1.allowBackup安全风险描述 Android API Level 8及其以上Android系统提供了为应用程序数据的备份和恢复功能,此功能的开关决定于该应用程序中AndroidManifes ...

  3. Android SearchView 自定义SearchIcon和字体颜色大小

    自定义SearchView的搜索图标和字体属性相对复杂一些,记下来. 一.自定义SearchIcon 1.API版本低于21:版本小于21时,要修改SearchIcon比较复杂,需要先获取到Searc ...

  4. Android属性动画完全解析(上),初识属性动画的基本用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...

  5. Android属性动画完全解析(中)

    转载:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是 ...

  6. Android属性动画完全解析(上)

    Android属性动画完全解析(上) 转载:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷 ...

  7. Android 自定义View修炼-【2014年最后的分享啦】Android实现自定义刮刮卡效果View

    一.简介: 今天是2014年最后一天啦,首先在这里,我祝福大家在新的2015年都一个个的新健康,新收入,新顺利,新如意!!! 上一偏,我介绍了用Xfermode实现自定义圆角和椭圆图片view的博文& ...

  8. Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法 ...

  9. Android属性动画之ValueAnimator的介绍

    之前两篇博客,介绍的是ObjectAnimator作用与某一个控件的某一个属性.但我们的ValueAnimator它本身并不会作用与任何一个属性,它本身也不会提供任何一种动画.它简单的来说,就是一个数 ...

随机推荐

  1. EasyUI DataGrid 多级表头设置

    使用EasyUI做一个报表统计,需要合并表头为多级表头,核心代码如下: $('#dg').datagrid({ url:'datagrid_data.action', fit : true, fitC ...

  2. UML类图简单说明,学习编程思路的必会技能

    摘抄记录学习用 先看一张图,图片资源来自于大话设计模式,接下来我要跟着这本书一起走,如侵权,立即删除. 看见上图估计没学过或者不是本专业的没接触过的人,看这一堆估计就不想看了,但别怕一个一个分析. 一 ...

  3. 日历类Calendar

    在早期的JDK版本中,日期(Date)类附有两大功能:(1)允许用年.月.日.时.分.秒来解释日期:(2)允许对表示日期的字符串进行格式化和句法分析.在JDK1.1中提供了类Calendar来完成第一 ...

  4. MYSQL数据库连接

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. 在mybatis 中批量加载mapper.xml

    可以直接加载一个包文件名,将这个包里的所有*mapper.xml文件加载进来. 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载: 必须按一定的标准:即xml文件和 ...

  6. IIS服务中五种身份验证的灵活运用

    微软IIS服务是一项经典的Web服务,可以为广大用户提供信息发布和资源共享功能.身份认证是保证IIS服务安全的基础机制,IIS支持以下5种 Web 身份认证方法: 一.匿名身份认证 如果启用了匿名访问 ...

  7. AndroidManifest.xml文件详解(activity)(四)

    android:multiprocess 这个属性用于设置Activity的实例能否被加载到与启动它的那个组件所在的进程中,如果设置为true,则可以,否则不可以.默认值是false. 通常,一个新的 ...

  8. 170227、java分布式系统开关功能设计(服务升降级)

    首先讲一下开关的由来,例如东京在6月18日做店庆促销活动,在交易下单环节,可能需要调用A.B.C三个接口来完成,但是其实A和B是必须的,C只是附加的功能(例如在下单的时候做一下推荐),可有可无,在平时 ...

  9. 【JS】JS中对于this的理解

    一.对this的产生原因分析和了解 第一:this指的是函数运行时所在的环境(即调用的对象). 第二:JavaScript 语言之所以有this的设计,跟内存里面的数据结构有关系(内存存储详细理解参考 ...

  10. chardet库:识别文件的编码格式

    chardet库文档 http://chardet.readthedocs.io/en/latest/usage.html 小文件的编码判断 detect函数只需要一个 非unicode字符串参数,返 ...