做Android布局是件很享受的事,这得益于他良好的xml方式。使用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>

二、在布局xml中如下使用该属性:

< ?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:orientation="vertical"
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>

三、在自定义组件中,可以如下获得xml中定义的值:

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();

就这么简单的三步,即可完成对自定义属性的使用。

*********************************************************************

好了,基本用法已经讲完了,现在来看看一些注意点和知识点吧。

首先来看看attrs.xml文件。

该文件是定义属性名和格式的地方,需要用<declare-styleable name="ToolBar"></declare-styleable>包围所有属性。其中name为该属性集的名字,主要用途是标识该属性集。那在什么地方会用到呢?主要是在第三步。看到没?在获取某属性标识时,用到"R.styleable.ToolBar_buttonNum",很显然,他在每个属性前面都加了"ToolBar_"。

在来看看各种属性都有些什么类型吧:string , integer , dimension , reference , color , enum......

前面几种的声明方式都是一致的,例如:<attr name="buttonNum" format="integer"/>。
只有enum是不同的,用法举例:

<attr name="testEnum">
<enum name="fill_parent" value="-1"/>
<enum name="wrap_content" value="-2"/>
< /attr>

如果该属性可同时传两种不同的属性,则可以用“|”分割开即可。

让我们再来看看布局xml中需要注意的事项。

首先得声明一下:xmlns:toolbar=http://schemas.android.com/apk/res/cn.zzm.toolbar
注意,“toolbar”可以换成其他的任何名字,后面的url地址必须最后一部分必须用上自定义组件的包名。自定义属性了,在属性名前加上“toolbar”即可。

最后来看看java代码中的注意事项。

在自定义组件的构造函数中,用

TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.ToolBar);

来获得对属性集的引用,然后就可以用“a”的各种方法来获取相应的属性值了。这里需要注意的是,如果使用的方法和获取值的类型不对的话,则会返回默认值。因此,如果一个属性是带两个及以上不用类型的属性,需要做多次判断,知道读取完毕后才能判断应该赋予何值。当然,在取完值的时候别忘了回收资源哦!

自定义属性数据类型简介:

一、reference:参考指定Theme中资源ID。

1.定义:

1
2
3
    <declare-styleable name="My"><attr name="label" format="reference" ></declare-styleable>

2.使用:

1
    <Buttonzkx:label="@string/label" >

二、Color:颜色

1.定义:

1
2
3
    <declare-styleable name="My"><attr name="textColor" format="color" /></declare-styleable>

2.使用:

1
    <Button zkx:textColor="#ff0000"/>

三、boolean:布尔值

1.定义:

1
2
3
    <declare-styleable name="My"><attr name="isVisible" format="boolean" /></declare-styleable>

2.使用:

1
    <Button zkx:isVisible="false"/>

四、dimension:尺寸值

1.定义:

1
2
3
    <declare-styleable name="My"><attr name="myWidth" format="dimension" /></declare-styleable>

2.使用:

1
    <Button zkx:myWidth="100dip"/>

五、float:浮点型

1.定义:

1
2
3
    <declare-styleable name="My"><attr name="fromAlpha" format="float" /></declare-styleable>

2.使用:

1
    <alpha zkx:fromAlpha="0.3"/>

六、integer:整型

1.定义:

1
2
3
    <declare-styleable name="My"><attr name="frameDuration" format="integer" /></declare-styleable>

2.使用:

1
    <animated-rotate zkx:framesCount="22"/>

七、string:字符串

1.定义:

1
2
3
    <declare-styleable name="My"><attr name="Name" format="string" /></declare-styleable>

2.使用:

1
    <rotate zkx:pivotX="200%"/>

八、fraction:百分数

1.定义:

1
2
3
    <declare-styleable name="My"><attr name="pivotX" format="fraction" /></declare-styleable>

2.使用:

1
    <rotate zkx:Name="My name is zhang kun xiang"/>

九、enum:枚举

1.定义:

1
2
3
4
5
    <declare-styleable name="My"><attr name="language"><enum name="English" value="1"/></attr></declare-styleable>

2.使用:

1
    <Button zkx:language="English"/>

十、flag:位或运算

1.定义:

1
2
3
4
5
6
    <declare-styleable name="My"><attr name="windowSoftInputMode"><flag name="stateUnspecified" value="1" /><flag name = "adjustNothing" value = "0x30" /></attr></declare-styleable>

2.使用:

1
    <activity android:windowSoftInputMode="stateUnspecified | adjustNothing">

属性定义时可以指定多种类型值:

1
2
3
    <declare-styleable name = "名称">    <attr name="background" format="reference|color" /></declare-styleable>

使用:

1
    <ImageView android:background = "@drawable/图片ID|#00FF00"/>

转载于:https://www.cnblogs.com/lzya/p/4913015.html

declare-styleable:自定义控件的属性相关推荐

  1. android 自定义控件gif压缩包,android显示gif图片(自定义控件以及属性)

    由于android所带的控件里面没有能够显示gif图片的 今天闲来无事,就来网上查查资料,打算搞一个能显示gif图片的自定义控件 网上的解决方法大致有三种 第一:先将gif图片分拆为N帧(由美工/软件 ...

  2. Android 中自定义控件和属性(attr.xml,declare-styleable,TypedArray)的方法和使用

    一. 在res/values 文件下定义一个attrs.xml 文件.代码如下: <?xml version="1.0" encoding="utf-8" ...

  3. android自定义控件padding属性无效的解决

    在自定义控件时,很多童鞋发现在XML布局中写上padding属性却不起作用,而且wrap_content和march_parent显示效果一样,这就需要我们在代码中对自定义View宽高做相应的改动,以 ...

  4. WPF的自定义控件 依赖属性,DependencyProperty 路由事件RoutedEvent

    起初,想添加TreeView的样式,在MouseOver时整行背景变色,但是我目前在XAML无法实现. 搜索了一下,有个方法在后台也要写代码. 参考:http://www.cnblogs.com/br ...

  5. 自定义控件添加属性_|AutoCAD LT 2019 Mac自定义功能区的方法

    AutoCAD LT是一款非常好用的CAD三维设计绘图软件,最新版本2019拥有改进的桌面.新应用实现跨设备工作流,以及DWG比较等新功能,并且AutoCAD LT 2019 Mac可以根据你的需要和 ...

  6. 自定义控件:属性为控件需要注意的地方

    如果属性为string.int等类,属性在设计时修改,运行时会保存. 如果属性为控件时,如Label,属性在设计时修改控件的属性,运行时会还原,这时可以通过添加 DesignerSerializati ...

  7. 【Andorid学习】declare-styleable:自定义控件的属性

    2019独角兽企业重金招聘Python工程师标准>>> http://www.cnblogs.com/jisheng/archive/2013/01/10/2854891.html ...

  8. android自定义组件属性,android自定义控件并添加属性的方法以及示例

    安卓系统为我们提供了丰富的控件,但是在实际项目中我们仍然需要重新通过布局来实现一些效果,比如我们需要一个上面图标,下面文字的button,类似于下面这样的: 最直接的解决办法是通过将imageview ...

  9. qt更改类名_Qt编写自定义控件属性设计器

    以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第一IDE,你能够想到的都给你封装好了,用起来不要太爽!因为项目需要自从全面转Qt开发已经6年有余,在工业控制领域,有一些应用场景需 ...

最新文章

  1. rs232串口驱动_LED驱动电路设计
  2. 可视化拖拽 UI 布局之拖拽篇
  3. Git 这样回退代码,才足够优雅
  4. Oracle 11g 基于CentOS7安装并启动em
  5. Tomcat端口被占用怎么查看占用程序
  6. 曝!BAT大厂NLP学习进阶之法~
  7. php-ast 开源,PHP AST学习 - osc_ryjlu6z2的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. 第1节 IMPALA:4、5、linux磁盘的挂载和上传压缩包并解压
  9. mysql-备份及关联python
  10. live555的安装 RTSP点播消息流程实例(客户端:VLC, RTSP服务器:LIVE555 Media Server)
  11. 解构变换矩阵:如何使变换矩阵分解为位移(T),旋转(R),缩放(S)矩阵
  12. 【Elasticsearch】Elasticsearch 集群协调迎来新时代
  13. 第九:Pytest进阶之xunit fixture
  14. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
  15. android 获取系统所有安装的应用程序
  16. 2017.5.26暴力赛解题报告
  17. PLM与ERP的区别
  18. 细说 Java 中的浅克隆与深克隆
  19. 微信公众号文章信息(阅读量、在看、点赞数)获取
  20. 如何在微信h5拉起支付宝支付界面

热门文章

  1. 【其它】我博客的个性化代码
  2. 需要在Emulator上模拟来电 效果
  3. Ubuntu Server对OpenStack的支持
  4. Excessive growth of the primary database log mirror and system Performance Monitoring
  5. 利用cmake查看OpenCV的源码的方法
  6. Window_Open详解
  7. 荣耀20搭载鸿蒙,荣耀20系列刚发布,搭载鸿蒙系统新机来袭,余承东已准备好!...
  8. 工作中用到的java反射机制_(转)JAVA-反射机制的使用
  9. OVS vswitchd启动(三十五)
  10. leetcode算法题--最小路径和