有时候android传统的页面布局不足以满足我们的需求,常常需要自己定义view,通常继承View,然后重写构造方法以及onDraw等函数,再 具体实现自己定义的复杂view。我们知道在给控件赋属性时,通常使用的是android系统自带的属性,比如 android:layout_height="wrap_content",除此之外,我们亦可以自己定义属性,这样在使用的时候我们就可以使用形如 myapp:myTextSize="20sp"的方式了,步骤大致如下:

1》在项目文件res/value下面创建一个attr.xml文件,该文件中包含若干个attr集合,例如:
[html]
<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <declare-styleable name="MyView">  
        <attr name="myTextSize" format="dimension"/>  
        <attr name="myColor" format="color"/>  
    </declare-styleable>  
</resources>  
 
其中resource是跟标签,可以在里面定义若干个declare-styleable,<declare-styleable name="MyView">中name定义了变量的名称,下面可以再自定义多个属性,针对<attr name="myTextSize" format="dimension"/>来说,其属性的名称为"myTextSize",format指定了该属性类型为dimension,只 能表示字体的大小。
format还可以指定其他的类型比如;
reference   表示引用,参考某一资源ID
string   表示字符串
color   表示颜色值
dimension   表示尺寸值
boolean   表示布尔值
integer   表示整型值
float   表示浮点值
fraction   表示百分数
enum   表示枚举值
flag   表示位运算
 
2》在使用到该自定义view的布局文件中键入如下的一行:
绿色是自己定义属性的前缀名字,粉色是项目的包名,这样一来,在我们自己定义的view的属性中,就可以使用自己在attr中定义的属性啦,例如:
[html] 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:myapp="http://schemas.android.com/apk/res/com.eyu.attrtextdemo"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    tools:context=".MainActivity" >  
  
    <TextView  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"  
        android:text="@string/hello_world" />  
    <com.eyu.attrtextdemo.MyView  
        android:layout_height="wrap_content"  
        android:layout_width="wrap_content"  
        myapp:myTextSize="20sp"  
        myapp:myColor="#324243"/>  
  
</LinearLayout>  
 
 
3》在自定义view的代码中引入自定义属性,修改构造函数
context通过调用obtainStyledAttributes方法来获取一个TypeArray,然后由该TypeArray来对属性进行设置
obtainStyledAttributes方法有三个,我们最常用的是有一个参数的obtainStyledAttributes(int[] attrs),其参数直接styleable中获得
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);
调用结束后务必调用recycle()方法,否则这次的设定会对下次的使用造成影响  
具体如下:
[java] 
package com.eyu.attrtextdemo;  
  
import android.content.Context;  
import android.content.res.TypedArray;  
import android.graphics.Canvas;  
import android.graphics.Paint;  
import android.graphics.Paint.Style;  
import android.util.AttributeSet;  
import android.view.View;  
  
public class MyView extends View{  
    public Paint paint;  
  
    public MyView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        paint = new Paint();  
          
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);      
        int textColor = a.getColor(R.styleable.MyView_myColor, 003344);  
        float textSize = a.getDimension(R.styleable.MyView_myTextSize, 33);  
        paint.setTextSize(textSize);  
        paint.setColor(textColor);  
        a.recycle();  
    }  
  
    public MyView(Context context) {  
        super(context);  
        // TODO Auto-generated constructor stub  
    }  
      
    @Override   www.2cto.com
    protected void onDraw(Canvas canvas) {  
        // TODO Auto-generated method stub  
        super.onDraw(canvas);     
        paint.setStyle(Style.FILL);  
        canvas.drawText("aaaaaaa", 10, 50, paint);  
    }  
      
      
      
}  
 
运行后:
                                        

转载于:https://www.cnblogs.com/Free-Thinker/p/3657447.html

Android自定义属性时TypedArray的使用方法相关推荐

  1. Android 自定义属性时TypedArray的使用

    对于自定义属性,遵循以下几步,就可以实现: 自定义一个CustomView(extends View )类 编写res/values/attrs.xml,在其中编写styleable和item等标签元 ...

  2. Delphi XE5开发的Android启动时黑屏解决方法

    默认的情况下,程序启动时,会有一个黑屏的时期,原因是,首个activity会加载一些数据,比如初始化列表数据等.    去除步骤  1./res/values/styles.xml 在 Theme 中 ...

  3. Android 自定义属性(attrs.xml,TypedArray)

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组 件不够用,自定义组件就不可避免了.那么如何才能做到像官 ...

  4. 【错误记录】Android 编译时技术报错 ( 注解处理器 process 方法多次调用问题 )

    文章目录 一.报错信息 二.问题分析 三.解决方案 注解处理器 AbstractProcessor 中的 process 方法可能会调用多次 , 在生成代码时 , 一定要注意 , 检测到 注解节点 后 ...

  5. android震动服务能设置时长么,Android实现手机振动设置的方法

    本文实例讲述了Android实现手机振动设置的方法.分享给大家供大家参考.具体如下: main.xml布局文件: android:orientation="vertical" an ...

  6. Android地图权限处理,Android 使用地图时的权限请求方法

    在初始化自己位置的时候请求定位权限: Constants.ACCESS_FINE_LOCATION_COMMANDS_REQUEST_CODE是自定义的常量值==0x01 if (ContextCom ...

  7. Android popupwindow 失去焦点或者点击空白区域时消失的解决方法

    Android popupwindow 失去焦点或者点击空白区域时消失的解决方法 参考文章: (1)Android popupwindow 失去焦点或者点击空白区域时消失的解决方法 (2)https: ...

  8. 【整理】学习Android Studio时遇到的错误及解决方法(持续更新)

    在这儿我整理出我在学习android studio时遇到的一些错误,以备以后学习查询. [错误1] [版本] android studio:3.3.2 OS:win10 [错误类型] 错误: 找不到符 ...

  9. android 相册png黑底,Android png透明图片转jpg时背景变黑的解决方法

    在做view保存图片后,压缩格式转为jpg的时候出现了黑色背景,其根本原因在于透明背景时背景的情况下,转换为jpg的时候会变成黑色背景,原因是PNG支持透明图而 JPG格式不支持透明背景. 我们的解决 ...

最新文章

  1. 引用-ZIGBEE-ZSTACK网络配置相关问题
  2. 如果连接远程的mysql数据库连不上,可用下面的方法试下
  3. 牛客网数据开发题库_数据库刷题—牛客网(21-30)
  4. mysql数据库rp集群_MySQL集群入门(PXC)
  5. 少走弯路:Mac+python+opencv
  6. 前端 JavaScript 复制粘贴的奥义——Clipboard 对象概述
  7. [4.14校内训练赛by hzwer]
  8. java中random方法取值范围_java中最值的求法,你可能忽略了这种方法了!
  9. java实现顺序表的增加,删除,查找,打印
  10. matlab对excel数据求均值,matlab对excel数据的处理,判断时间是否相同,求均值
  11. perl语言十分钟入门【零基础可入】
  12. 2018年信息安全大事件一览
  13. linux dd 拷贝文件,Linux系统中使用dd命令来转换和拷贝文件
  14. 计算机网络AD名词解释,计算机网络名词解释 AD是什么意思?
  15. 在Centos下安装java jdk
  16. c语言程序考试试题,C语言程序设计期末考试试题(含答案)
  17. 数学中说的线性关系线性是什么意思?
  18. mysql数据存储过程添加数据_Mysql 存储过程 自动插入数据
  19. 计算机宏的PPT,计算机应用宏基础63957.ppt
  20. 谜题20:我的类是什么?

热门文章

  1. getpriority java_Java Thread类的最终int getPriority()方法(带示例)
  2. python列表、元组、字典、集合区别及他们之间的转换(超全)
  3. 最新发布|深度学习必学“圣经”花书出视频课了!附带论文代码精读讲解!
  4. 【项目.源码】深度学习实现任意风格任意内容的极速风格迁移
  5. 昔年浅谈做害虫消杀防护的用什么推广效果好?
  6. php伪类,CSS3新增伪类
  7. python网页数据处理_python 处理html页面爬虫数据
  8. R语言中管道操作 %%, %T%, %$% 和 %%
  9. Ubuntu Gitosis安装设置
  10. Linux内核源代码分析——插入之后会发生什么?