原文链接:

http://wujiandong.iteye.com/blog/1184921

属性(Attribute)资源:属于整个Android应用资源的一部分.其实就是网上一堆介绍怎么给自定义View添加自己的属性文章里的attrs文件,此文件位于../res/values/目录下

当别人通过XML文件配置的方式来创建你开发的自定义组件,并且还能动态设置你自定义组件的属性时,这时候你就需要给你自己自定义的组件配上一个XML属性资源文件来完成这项工作了.

其实也可以不配上一个XML属性资源文件,也能完成如上的功能,这样你的自定义组件显得更干脆一点,一个自定义组件就是一个类文件,不拖泥带水的。但是这两种方式是有区别的,具体看自己的需求来选择了,以下为两种实现方式:

1:配合XML属性资源文件的方式 
  第一步:attrs.xml文件 
  首先当然是要写出自定义组件的类文件了,然后将这个类里需要外界传入值的属性定义成一个属性资源文件. 
  在工程里的../res/values/目录下创建一个attrs.xml文件,文件名并不是只能写成这样,这样写只有一个目的,别人一看就知道这个文件是属性资源文件了,具体写法如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3. <attr name="test1" format="string" />
  4. <declare-styleable name="MyView">
  5. <attr name="textColor" format="color" />
  6. <attr name="textSize" format="dimension" />
  7. <attr name="text" format="string" />
  8. </declare-styleable>
  9. </resources>

attrs.xml解释如下

  1. attr子元素:
  2. 定义具体的属性,format表示这个属性的值的类型,类型有以下几种:
  3. 1.reference:参考指定Theme中资源ID,这个类型意思就是你传的值可以是引用资源
  4. 2.string:字符串,如果你想别人既能直接写值也可以用类似"@string/test"引用资源的方式,可以写成format="string|reference"
  5. 3.Color:颜色
  6. 4.boolean:布尔值
  7. 5.dimension:尺寸值
  8. 6.float:浮点型
  9. 7.integer:整型
  10. 8.fraction:百分数
  11. 9.enum:枚举 ,如果你提供的属性只能让别人选择,不能随便传入,就可以写成这样
  12. <attr name="language">
  13. <enum name="china" value="1"/>
  14. <enum name="English" value="2"/>
  15. </attr>
  16. 10.flag:位或运算
  17. declare-styleable子元素:
  18. 定义一个styleable对象,每个styleable对象就是一组attr属性的集合 注意:这里的name属性并不是一定要和自定义类名相同,只是为了好区分对应类的属性而已
  19. 注意:上面的属性资源文件定义了该属性之后,至于到底是哪个自定义View组件中来使用该属性,该属性到底能发挥什么作用, 就不归该属性资源文件管了,也就是说这个属性资源文件是个公共的,大家都可以用,但是为了方便管理,一般都是一个自定义View里的属性写成一个declare-styleable集合.属性资源所定义的属性到底可以返回什么作用,取决于自定义组件的代码实现

第二步:在自定义类里引用attrs文件里定义的属性为自己的属性设置值

  1. package cn.com.androidtest.ui;
  2. import cn.com.androidtest.R;
  3. import android.content.Context;
  4. import android.content.res.TypedArray;
  5. import android.graphics.Canvas;
  6. import android.graphics.Color;
  7. import android.graphics.Paint;
  8. import android.graphics.Paint.Style;
  9. import android.graphics.Rect;
  10. import android.util.AttributeSet;
  11. import android.view.View;
  12. public class MyView extends View
  13. {
  14. private Paint mPaint;
  15. private Context mContext;
  16. private static String mString;
  17. private String test;
  18. public MyView(Context context)
  19. {
  20. super(context);
  21. mPaint = new Paint();
  22. }
  23. public MyView(Context context,AttributeSet attrs)
  24. {
  25. super(context,attrs);
  26. mPaint = new Paint();
  27. /*这里取得declare-styleable集合*/
  28. TypedArray typeArray = context.obtainStyledAttributes(attrs,R.styleable.MyView);
  29. /*这里从集合里取出相对应的属性值,第二参数是如果使用者没用配置该属性时所用的默认值*/
  30. int textColor = typeArray.getColor(R.styleable.MyView_textColor,0XFFFFFFFF);
  31. float textSize = typeArray.getDimension(R.styleable.MyView_textSize, 36);
  32. mString = typeArray.getString(R.styleable.MyView_text);
  33. /*设置自己的类成员变量*/
  34. mPaint.setTextSize(textSize);
  35. mPaint.setColor(textColor);
  36. /*关闭资源*/
  37. typeArray.recycle();
  38. }
  39. @Override
  40. protected void onDraw(Canvas canvas)
  41. {
  42. super.onDraw(canvas);
  43. mPaint.setStyle(Style.FILL);
  44. canvas.drawRect(new Rect(10, 10, 90, 90), mPaint);
  45. mPaint.setColor(Color.BLUE);
  46. canvas.drawText(mString, 10, 110, mPaint);
  47. }
  48. }

第三步:使用自定义组件,并设置属性

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:myandroid="http://schemas.android.com/apk/res/cn.com.androidtest"
  5. android:orientation="vertical"
  6. android:layout_width="fill_parent"
  7. android:layout_height="fill_parent"
  8. >
  9. <TextView
  10. android:layout_width="fill_parent"
  11. android:layout_height="wrap_content"
  12. android:text="@string/hello"/>
  13. <cn.com.androidtest.ui.MyView
  14. android:layout_width="fill_parent"
  15. android:layout_height="wrap_content"
  16. myandroid:textColor="#ff0000"
  17. myandroid:textSize="20px"
  18. myandroid:text="http://wujiandong.iteye.com"/>
  19. </LinearLayout>

注意:java代码里那种取属性值的方式,那么在XML使用该组件的时候一定要为该自定义组件设置一个命名空间[xmlns:myandroid="http://schemas.android.com/apk/res/cn.com.androidtest"],不然组件属性设置不了 
命名空间写法:xmlns:空间名="http://schemas.android.com/apk/res/自定义组件所在包名" 
写包名时候也有个要注意的地方: 
如果你的自定义View所在包类似如下两图,那么包名只能写成最顶层包[cn.com.androidtest],而不能是[cn.com.androidtest.ui]


 

第四步:终于完成了,看下效果图

2:不需要配合XML资源文件的方式 
基本与第一种方式相同,只是java代码取属性值的部分,和别人用你自义View时有点区别

java代码写法:

  1. /*资源ID号引用*/
  2. int resouceId = -1;
  3. /*取得资源ID号,第一个参数:命名空间名.第二个参数:xml文件里设置的属性名.第三个参数:默认值*/
  4. resouceId = attrs.getAttributeResourceValue(null, "textColor", 0);
  5. if (resouceId > 0)
  6. textColor = context.getResources().getColor(resouceId);
  7. resouceId = attrs.getAttributeResourceValue(null, "textColor", 0);
  8. if(resouceId > 0)
  9. mString = context.getResources().getText(resouceId, "http://wujiandong.iteye.com").toString();

XML中使用的时候,命名空间可以不要,属性名就要自己对应好了,不然程序取不到,不像有XML资源文件配合的方式有个约束.绝对自由等于没有自由~~

  1. <cn.com.androidtest.ui.MyView
  2. android:layout_width="fill_parent"
  3. android:layout_height="wrap_content"
  4. textColor="#ff0000"
  5. textSize="20px"
  6. text="http://wujiandong.iteye.com"/>

Android应用资源--之属性(Attribute)资源的更多相关文章

  1. Android开发---如何操作资源目录中的资源文件4 ---访问xml的配置资源文件的内容

    Android开发---如何操作资源目录中的资源文件4 XML,位于res/xml/,这些静态的XML文件用于保存程序的数据和结构. XmlPullParser可以用于解释xml文件 效果图: 描述: ...

  2. Android根据字符串型的资源名获取对应资源id

    有时候我们想动态的根据一个字符串资源名获得到对应的资源id,如根据不同的图片名称获得对应的图片,此时就应该考虑如何实现. 大家知道,在编译Android工程时,系统会自动生成一个静态资源类R,里面根据 ...

  3. 【我的Android进阶之旅】Android使用getIdentifier()方法根据资源名来获取资源id

    有时候我们想动态的根据一个资源名获得到对应的资源id,就可以使用getResources().getIdentifier()方法来获取该id.然后再使用该id进行相关的操作. 1.Demo示例 下面用 ...

  4. Android资源之图像资源(图像级别资源)

    图像状态资源仅仅能定义有限的几种状态. 假设须要很多其它的状态,就要使用图像级别资源. 在该资源文件里能够定义随意多个图像级别. 每一个图像级别是一个整数区间,能够通过ImageView.setIma ...

  5. Android资源之图像资源(状态图像资源)

    在上一篇博文中.我主要解说了XML图像资源中的图层资源,在此图像资源博文中我会给大家陆续解说XMl图像资源的图像状态资源.图像级别资源.淡入淡出资源.嵌入图像资源.剪切图像资源和外形资源. 1.图像状 ...

  6. Android 文件夹命名规范 国际化资源

    Android 文件夹命名规范 国际化资源 android多国语言文件夹文件汇总如下: 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values- ...

  7. android学习笔记40——国际化和资源自适应

    国际化——Internationalization,简称I18N. 本地化——Localization,检查L10N. java国际化资源的思路: java提供国际化资源的思路,是将程序中的标签.提示 ...

  8. android学习笔记39——使用原始资源

    原始资源 android中没有专门提供管理支持的类型文件,都被称为原始资源.例如:声音资源... android原始资源存放位置: 1.res/raw,android SDK会处理该目录下的原始资源, ...

  9. Android开发者必知的开发资源

    推荐书籍 我推荐下面两本书: The Busy Coder’s Guide to Android Development <The Busy Coder’s Guide to Android D ...

随机推荐

  1. update更新两个字段

    update更新两个字段时的sql语句: update tj_record set is_recycle_reprint_guide='1' , recycle__guide_date=now() w ...

  2. uva11324 The Largest Clique --- 强连通+dp

    给一个有向图G,求一个子图要求当中随意两点至少有一边可达. 问这个子图中最多含多少个顶点. 首先找SCC缩点建图.每一个点的权值就是该点包括点的个数. 要求当中随意两点可达,实际上全部边仅仅能同方向, ...

  3. URAL 2056 Scholarship 水题

    ScholarshipTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

  4. 关于null和undefined

    null和undefined都是一种类型..typeof查看变量类型.不要为该函数迷惑..因为他只是看上去官方! 见http://www.cnblogs.com/zhepama/articles/30 ...

  5. c++中的强制转换static_cast、dynamic_cast、reinterpret_cast的不同用法儿

    c++中的强制转换static_cast.dynamic_cast.reinterpret_cast的不同用法儿   虽然const_cast是用来去除变量的const限定,但是static_cast ...

  6. MYSQL SQL 审核工具 (inception安装步骤)

    http://blog.csdn.net/wulantian/article/category/5825391

  7. Helpers\PHPMailer

    Helpers\PHPMailer PHPMailer is a third party class for sending emails, Full docs are available athtt ...

  8. Helpers\Hooks

    Helpers\Hooks Add modules with hooks The hooks helper allows modules to be created within the module ...

  9. Linux 同步时间

    Linux里有2个时间: 硬件时间 系统时间 这2个时间不是同步的!如果有一天发现系统的时间不对了,可以分别看看这2个时间.硬件时间写在BIOS里,系统时间就是电脑显示的时间了. sudo hwclo ...

  10. Apache服务器中配置虚拟机的方法

    新浪微博虚拟机开发配置步骤及介绍.1.由于后面虚拟机中需要用到Rewrite所以先编辑Apache的conf目录下的httpd.conf文件.(可根据实际需要操作)添加mod_rewrite.so模块 ...