android view设置属性,android 自定义View属性

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

03aa27fad6c8d3285bdc1d6b0e31b98f.png

android:src  和android:scaleType为ImageView指定了图片源和图片缩放类型。

其实我们也可以自定义图片的这种属性。

下面以自定义标题栏为例,简单说明下自定义View属性。

比如在项目中,经常会用到标题栏,左边是返回,中间是标题,右边是下一步。如下图:

faacf71a675d50d84c19b9350188656b.png

如果,每一次用到标题都在XML里面进行布局,那就太麻烦了。我们可以自定义一个标题栏。

自定义View的方式基本有三种:

1,继承View类,比如 View ImageView。

2,组合的方式,就是把已知的多个View组合在一起。也是通过继承其中一个View,用动态加载的方式,把其他View组合到一起。

3,继承ViewGroup类,比如我们熟悉的五大布局,ViewPager等。

我们使用第二种,组合的方式。

28509286b8ae7d69208c0064b4163c29.png

在构造函数中,动态的把标题栏的xml文件加载进去。

d684f886e65a0d6fa7f597e26f9d037b.png

common_title.xml:

xml version="1.0" encoding ="utf-8" ?>

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" >

android:id="@+id/left_iv"android:layout_width="25dip"android:layout_height="match_parent"android:src="@drawable/back"android:layout_marginLeft="10dip" />

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" />

android:id="@+id/right_ll"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_alignParentRight="true"android:orientation="horizontal" >

android:id="@+id/right_iv"android:layout_width="25dip"android:layout_height="match_parent"android:src="@drawable/next"android:layout_marginLeft="10dip" />

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" />

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" >

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" />

android:id="@+id/middle_iv"android:layout_width="25dip"android:layout_height="match_parent"android:src="@drawable/click_down"

/>

OK,现在CommmTitleView已经是有界面的View了,我们在XML中直接使用可以使用了。

ff98c8b638448b49f7f57ad6111a7d2a.png

图中,my: 开头的就是自定义属性,我定义了CommonTitleView的左边图片,左边文字,右边图片等。接下来就接着讲如何实现。

首先要在value文件夹下建立attr.xml:

< 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" />

这个文件声明了有哪些自定义属性。其中 attr:name 是自定义属性的名称,format后面是该属性的类型。

format属性有:

reference   表示引用,参考某一资源ID

string   表示字符串

color   表示颜色值

dimension   表示尺寸值

boolean   表示布尔值

integer   表示整型值

float   表示浮点值

fraction   表示百分数

enum   表示枚举值

flag   表示位运算

attr.xml就是声明了这个View有哪些属性,属性名称是什么,属性类型是什么。

然后,在声明下命名空间,就可以使用自己定义的这些属性了。

94b88b71438b8fd2d0e1858536462229.png

第一行,是系统的命名空间。

第二行,xmlns:my就是我们APP自身的命名空间。声明后,就可以使用我们在attr.xml中声明的属性了。

那么,在XML中声明这些属性后,如何让CommonTitleView知道我们声明了哪些属性呢?

这就需要在CommontitleView,构造函数中,获取这些属性,然后根据获取的属性值,做出处理。如下图:

cb23407fb4c3193e1518f86454a10a07.png

在构造函数中,我们使用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中。

137f7d3f0b8a3b220539cd3986608fe8.png

这样,我们自定义的标题栏就OK了。

除此之外,还可以为标题栏中的返回,下一步等设置监听。

1ee15073e01f53b85155c686520c226a.png

还可以定义接口,在外部使用的时候动态的来设定标题栏中的内容:

e9ce49a414a6f836497efda423ddc51e.png

下面是在Activity中使用的例子:

现在main.xml中定义

c0f4f499b42c5156ac40b0355bb9a07c.png

在Activity中自由的设置监听:

73ba347b9215246c6298f65f5e94458c.png

最后附上源码:http://pan.baidu.com/s/1ntxiPTn

原文:http://www.cnblogs.com/Theone2014/p/4776576.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值