在android开发过程中,用到系统的View时候可以通过XML来定义一些View的属性。比如ImageView:

 
android:src  和android:scaleType为ImageView指定了图片源和图片缩放类型。
其实我们也可以自定义图片的这种属性。
下面以自定义标题栏为例,简单说明下自定义View属性。
 
比如在项目中,经常会用到标题栏,左边是返回,中间是标题,右边是下一步。如下图:
 
如果,每一次用到标题都在XML里面进行布局,那就太麻烦了。我们可以自定义一个标题栏。
自定义View的方式基本有三种:
1,继承View类,比如 View ImageView。
2,组合的方式,就是把已知的多个View组合在一起。也是通过继承其中一个View,用动态加载的方式,把其他View组合到一起。
3,继承ViewGroup类,比如我们熟悉的五大布局,ViewPager等。
我们使用第二种,组合的方式。
在构造函数中,动态的把标题栏的xml文件加载进去。
common_title.xml:

xml version="1.0" encoding ="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width= "fill_parent"
android:layout_height= "match_parent"
android:layout_gravity= "center"
android:background= "#123456" > <LinearLayout
android:id="@+id/left_ll"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:gravity="center_vertical|left"
android:orientation="horizontal" > <ImageView
android:id="@+id/left_iv"
android:layout_width="25dip"
android:layout_height="match_parent"
android:src="@drawable/back"
android:layout_marginLeft="10dip" /> < TextView
android:id="@+id/left_tv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="10dip"
android:gravity="center_vertical"
android:textColor="#ffffff"
android:text="返回"
android:textSize="16sp" />
</LinearLayout> <LinearLayout
android:id="@+id/right_ll"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentRight="true"
android:orientation="horizontal" > <ImageView
android:id="@+id/right_iv"
android:layout_width="25dip"
android:layout_height="match_parent"
android:src="@drawable/next"
android:layout_marginLeft="10dip" /> < TextView
android:id="@+id/right_tv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_marginLeft="10dip"
android:gravity="center_vertical"
android:textColor="#ffffff"
android:text="下一步"
android:textSize="16sp" />
</LinearLayout> <LinearLayout
android:id="@+id/middle_ll"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toLeftOf="@id/right_ll"
android:layout_toRightOf="@id/left_ll"
android:gravity="center_horizontal"
android:orientation="horizontal" > < TextView
android:id="@+id/middle_tv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="我是标题"
android:gravity="center_vertical"
android:textColor="#ffffff"
android:textSize="16sp" /> <ImageView
android:id="@+id/middle_iv"
android:layout_width="25dip"
android:layout_height="match_parent"
android:src="@drawable/click_down"
/>
</LinearLayout> </RelativeLayout>
<?
 
OK,现在CommmTitleView已经是有界面的View了,我们在XML中直接使用可以使用了。
 
图中,my: 开头的就是自定义属性,我定义了CommonTitleView的左边图片,左边文字,右边图片等。接下来就接着讲如何实现。
 
首先要在value文件夹下建立attr.xml:
 
<?xml version="1.0" encoding ="utf-8" ?>
<resources> <declare-styleable name= "CommonTitleView">
< attr name= "leftTv" format ="integer" />
< attr name= "leftIv" format ="integer" />
< attr name= "rightTv" format ="integer" />
< attr name= "rightIv" format ="integer" />
< attr name= "middleTv" format ="integer" />
< attr name= "middleIv" format ="integer" />
</declare-styleable> </resources>
 
 
这个文件声明了有哪些自定义属性。其中 attr:name 是自定义属性的名称,format后面是该属性的类型。
format属性有:
reference   表示引用,参考某一资源ID
string   表示字符串
color   表示颜色值
dimension   表示尺寸值
boolean   表示布尔值
integer   表示整型值
float   表示浮点值
fraction   表示百分数
enum   表示枚举值
flag   表示位运算
attr.xml就是声明了这个View有哪些属性,属性名称是什么,属性类型是什么。
然后,在声明下命名空间,就可以使用自己定义的这些属性了。
 
第一行,是系统的命名空间。
第二行,xmlns:my就是我们APP自身的命名空间。声明后,就可以使用我们在attr.xml中声明的属性了。
那么,在XML中声明这些属性后,如何让CommonTitleView知道我们声明了哪些属性呢?
这就需要在CommontitleView,构造函数中,获取这些属性,然后根据获取的属性值,做出处理。如下图:
 
在构造函数中,我们使用TypedArray把在xml文件中声明的属性装起来。关于TypedArray的介绍,源码里面很简单:就是装属性的容器。
然后依次,通过我们在attr.xml中设置的属性名称,获取对应的值。
比如,xml中写的是my:leftIv="@drawble/back"
在构造函数中通过
int resouce_left_iv = typedArray.getResourceId ( R.styleable.CommonTitleView_leftIv, 0);
得到资源文件back图片的资源ID。
R. styleable .CommonTitleView_leftIv的意思就是名称为CommonTitleView的leftIv属性。
那么,resouce_left_iv 就是图片back对应的资源ID.
其他的属性都是通过上述方法添加进去的,比如文字等。
拿到资源ID后,就可以把资源设置到定义的View中。
 
这样,我们自定义的标题栏就OK了。
除此之外,还可以为标题栏中的返回,下一步等设置监听。
 
还可以定义接口,在外部使用的时候动态的来设定标题栏中的内容:
 
下面是在Activity中使用的例子:
现在main.xml中定义
 
在Activity中自由的设置监听:
 
最后附上源码:http://pan.baidu.com/s/1ntxiPTn
 

android 自定义View属性的更多相关文章

  1. android自定义view属性

    第一种 /MainActivity/res/values/attrs.xml <?xml version="1.0" encoding="utf-8"?& ...

  2. Android读取自定义View属性

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

  3. (转)[原] Android 自定义View 密码框 例子

    遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...

  4. Android 自定义View (五)——实践

    前言: 前面已经介绍了<Android 自定义 view(四)-- onMeasure 方法理解>,那么这次我们就来小实践下吧 任务: 公司现有两个任务需要我完成 (1)监测液化天然气液压 ...

  5. Android 自定义 view(三)—— onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

  6. Android 自定义view(二) —— attr 使用

    前言: attr 在前一篇文章<Android 自定义view -- attr理解>已经简单的进行了介绍和创建,那么这篇文章就来一步步说说attr的简单使用吧 自定义view简单实现步骤 ...

  7. [原] Android 自定义View步骤

    例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能 ...

  8. [原] Android 自定义View 密码框 例子

    遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...

  9. Android -- 自定义View小Demo,动态画圆(一)

    1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...

随机推荐

  1. javascript之容易出错的地方

    1: 不是所有的非空对象都有toString()方法的 var obj = Object.create(null); console.log(obj.toString());   // false; ...

  2. IE 之 userData 模拟 localStorage

    引 chrome,  safari, firefox, ie 9都支持 localStorage.  但可恶的是,中国 ie 6 占有最大的比例. 使用 cookie 不但容量有限,而且给我们增加了不 ...

  3. 【C++】C++函数重载的总结

    函数重载: 出现在相同作用域中的两个函数,如果具有相同的名字而形参表不同,则称为重载函数(overloaded function).一定要注意函数重载的两个关键词:形参列表和作用域. 任何程序有且仅有 ...

  4. SPOJ4717——Grid Points in a Triangle

    题目的意思很简单.就是要你求出斜率为a/b的一个点在原点,一条边为x=n的RT三角形里面有多少个整数点? 看完题目后依然没有思路,依然去看各个神牛写的题解.后来才反应过来. 题目的正解应该是这样的.递 ...

  5. Struts访问序号的设置

  6. poj2914-Minimum Cut

    题意 \(n\) 个点 \(m\) 条边的无向带权图求全局最小割.\(n\le 500,m\le \frac{n(n-1)}{2}\) . 分析 参考了 这篇博客,去给他点赞. 嘛,今天研究了一下全局 ...

  7. [poi2011]bzoj 2277 —— strongbox·[洛谷3518]

    ·问题描述· 有一个密码箱,0到n-1中的某些数是它的密码.且满足:如果a和b都是它的密码,那么(a+b)%n也是它的密码.某人试了k次密码,前k-1次都失败了,最后一次成功. 问:该密码箱最多有多少 ...

  8. 【BZOJ3504】危桥(网络流)

    [BZOJ3504]危桥(网络流) 题面 BZOJ 洛谷 Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的, ...

  9. Hbase(一)基础知识

    一.Hbase数据库介绍 1.简介 HBase 是 BigTable 的开源 java 版本.是建立在 HDFS 之上,提供高可靠性.高性能.列存储. 可伸缩.实时读写 NoSQL 的数据库系统. N ...

  10. 【原创】【目录】实现rich editor(富文本编辑器)教程,深入理解selectiona/range操作与浏览器差异

    日常工作中,接触富文本编辑的次数还是很多,特发此教程,希望可以改变富文本编辑的技术门槛较高的现状,解决这部分的坑. 前提准备,兼容获取range,统一回车行为,前期准备工作 了解document.ex ...