Android之自定义属性
有些时候会觉得Android中提供的控件不能满足项目的要求,所以就会常常去自定义控件。自定义控件就不免会自定义属性。自定义属性大致需要三个步骤:在XML文件中定义自定义属性的名称和数据类型、在布局中调用自定义属性、在代码中获取自定义属性。下面来详细的解析一下这三个步骤。
一、在XML文件中定义自定义属性的名称和数据类型
在项目的res/values文件夹下新建一个attrs.xml的文件,在文件中设置自定义属性的名称和类型。代码如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ToolBar">
<attr name="buttonNum" format="integer"/>
<attr name="itemBackground" format="reference|color"/>
</declare-styleable>
</resources>
attrs.xml文件中的代码
这里需要注意以下几个问题:
1、这个文件是定义属性名和属性数据格式的地方,需要用<declare-styleable name="..."><declare-styleable/>标签包裹所有的自定义属性。在这个标签中,name是该属性集的名称,主要用途是标识该属性集。一个项目可以有多个自定义控件,但是只能有一个attrs.xml文件,所以,我们需要用一个标签来区别各个自定义控件的属性集。除了起到区分控件的作用,这个name还要在下面的第三个步骤中用到,即在JAVA代码中需要通过这个名字来取出这个属性。
2、在<declare-styleable>标签下,我们需要用<attr name="..." format="..."></attr>来定义属性及它们的数据类型。主要的数据类型有以下几种:string(字符串)、integer(整形,如12)、float(浮点型,如0.7)、dimension(尺寸,如10.0dip)、boolean(布尔型,如true)、reference(参考某一资源ID,如@string/app_name)、color(颜色代码,如#FF0000)、fraction(百分比,如200%)、enum(枚举)。
在上面这些类型中,需要我们注意的有两点:
(1)enum枚举类型的定义和其他类型数据的定义都不一样,enum类型数据的定义实例如下代码所示:
<declare-styleable name="ToolBar">
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
</declare-styleable>
枚举类型属性定义
(2)这些属性可以复合起来使用,像 <attr name="background" format="reference|color" /> 这样,表示可以传多种不同的值,即background这个属性既可以是某个已经定义了的值,也可以是某个现成的颜色。
二、在布局文件中调用自定义属性
在某个布局文件中使用自定义属性的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:toolbar="http://schemas.android.com/apk/res/cn.zzm.toolbar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<cn.zzm.toolbar.ToolBar android:id="@+id/gridview_toolbar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="@drawable/control_bar"
android:gravity="center"
toolbar:buttonNum="5"
toolbar:itemBackground="@drawable/control_bar_item_bg"/>
</RelativeLayout>
布局文件的代码
这个步骤就是把第一步在attrs.xml文件中定义的自定义属性写到布局文件中。在这里我们依然需要注意几个问题:
1、我们需要首先声明一下这些自定义属性的命名空间(NameSpace)。我们通常使用的Android自带的属性都会以“android:”开头,所以我们会在每个布局文件的前面几行中看到这行代码: xmlns:android="http://schemas.android.com/apk/res/android" ,这表示声明一个命名空间,这个命名空间中的所有属性都用“android:”开头。因此,如果我们需要使用我们自己定义的属性,也需要在文件的开头定义这样一个类似的命名空间。在上面的代码中,我们定义的命名空间是这样的: xmlns:toolbar="http://schemas.android.com/apk/res/cn.zzm.toolbar" ,这表示我们自定义的命名空间的名称叫toolbar,下面我们调用自定义属性的时候就需要在前面加上“toolbar:”前缀。
2、在我们自定义的命名空间中有这样一段代码:“cn.zzm.toolbar”,很多人认为这个是自定义控件所在的包名,实际上不是的,这里是主界面的java文件所在的包名,我们可以去项目的Menifest文件中(<menifest>标签中的package属性中的值)查看并拷贝。
3、命名空间的名称的命名是无限制的,我们可以随意制定,没有特定的规定,如上面代码中的toolbar。
4、在自定义控件中使用自定义属性时,我们需要通过我们上面定义的命名空间来找到这个属性,如: toolbar:buttonNum="5" 。
三、在代码中获取自定义属性的值
这个操作通常是在自定义控件的两个参数的构造方法或三个参数的构造方法中进行的。在JAVA代码中,我们要想获取自定义属性,就需要通过下面的代码来获取:
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ToolBar);
buttonNum = a.getInt(R.styleable.ToolBar_buttonNum, 5);
itemBg = a.getResourceId(R.styleable.ToolBar_itemBackground, -1);
......
a.recycle();
在Java代码中获取自定义属性的值
这里没什么好说的,仿照这段代码就可以取出自定义属性的值了。值得注意的是,我们在完成取值之后,需要把TypedArray释放掉,即这段代码中的 a.recycle(); 。
Android之自定义属性的更多相关文章
- Android中自定义属性(attrs.xml,TypedArray的使用)
做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...
- Android中自定义属性的使用
做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...
- 关于Android attrs 自定义属性的说明
写个自定义控件时经常要自定义一些自己的属性,平时用的都是那几个,今天就顺便一起总结一下这个东东吧- 一.定义:属性的定义都在attrs.xml文件里面: 二.读取:通过都是通过TypedArray去读 ...
- android开发:Android 中自定义属性(attr.xml,TypedArray)的使用
今天我们的教程是根据前面一节扩展进行的,如果你没有看,请点击 Android高手进阶教程(三)查看第三课,这样跟容易方便你的理解! 在xml 文件里定义控件的属性,我们已经习惯了android:att ...
- Android中自定义属性attr.xml的格式详解
1. reference:参考某一资源ID. (1)属性定义: <declare-styleable name = "名称"> ...
- Android 自定义属性(attrs.xml,TypedArray)
做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组 件不够用,自定义组件就不可避免了.那么如何才能做到像官 ...
- [置顶]
xamarin android自定义标题栏(自定义属性、回调事件)
自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...
- Android自定义属性:attr.xml 与 TypedArray
1.attr.xml <?xml version="1.0" encoding="utf-8"?> <resources> <de ...
- Android学习笔记_49_Android中自定义属性(attrs.xml,TypedArray的使用)
做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...
随机推荐
- .NET 缩略图服务器 ResizingServer
之前写过一篇文章 .NET 响应式自动缩略图服务器 之后对此Image Server又进行了基于ImageResizer的改写 基于.NET 图片服务器 支持缩略图格式 基于 ImageResizer ...
- 【小白的CFD之旅】05 补充基础
黄师姐是一个很干脆果敢的人,从她的日常装扮就能显露出来.卡帕运动装,白色运动鞋,马尾辫,这是小白对黄师姐的第一印象.“明天早上九点钟来实验室,我给你安排这阵子的任务.”黄师姐对小白说.说话语气和老蓝一 ...
- 电脑控制Android设备的软件——Total Control
最早开始搞Android开发时,为了调试方便,想找一个Android下的远程控制软件,支持在电脑端远程控制和同步显示Android设备.先后试了360手机助手.Mobizen.Vysor和Mirror ...
- Ubuntu raid5+lvm实验
首先说一下本次实验的环境:VMware12+Ubuntu (虚拟硬盘+mdadm) 本次实验参照http://allenyu.blog.51cto.com/193668/162067中的流程,下面总结 ...
- Objective C中的ARC的修饰符的使用---- 学习笔记九
#import <Foundation/Foundation.h> @interface Test : NSObject /** * 默认的就是__strong,这里只是做示范,实际使用时 ...
- python-网络编程-socket编程
一.TCP\IP(网络通信协议)简介 TCP:(Transmission Control Protocol)传输控制协议,面向有连接的通信协议 UDP:数据报文协议,面向无连接的通信协议 ...
- JSLint检测Javascript语法规范
前端javascript代码编写中,有一个不错的工具叫JSLint,可以检查代码规范化,压缩JS,CSS等,但是他的语法规范检查个人觉得太“苛刻”了,会提示各种各样的问题修改建议,有时候提示的信息我们 ...
- CWMP开源代码研究2——easycwmp安装和学习
声明:本文是对开源程序代码学习和研究,严禁用于商业目的. 如有任何问题,欢迎和我交流.(企鹅号:408797506) 本文所有笔记和代码可以到csdn下载:http://download.csdn.n ...
- linux ubuntu14 更改为root用户登录
设置使用root用户登陆首先要修改root的登陆密码sudo passwd root1.输入sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu ...
- .net ServiceStack.Redis 性能调优
最近在debug生产环境的问题时,发现了ServiceStack 4.0.60版本RedisClient存在一个非常严重的性能问题.在高并发下,PooledRedisClientManager.Get ...