Android 自定义 attr属性

原创 2015年11月17日 23:16:28
最近在封装一些 自定义的View 遇到了一些 自定义attr 属性的问题, 这里来复习总结下:

1. 定义attire 属性

在res/values  文件下新建一个attrs.xml 里面都是些 attr 属性相关的文件

在里面可以自己 定义 属性 如下: 

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyView">
        <attr name="textColor" format="color"/>
        <attr name="textSize" format="dimension"/>
    </declare-styleable>
    <declare-styleable name="MyImageView">
        <attr name="imgSrc" format="reference"/>
    </declare-styleable>
</resources>

上面的内容很容易理解,  需要注意的是 format 有以下几种类型:
1.reference:参考某一资源ID( 图片资源之类的)
2. color:颜色值
3. boolean:布尔值
4. dimension:尺寸值
5. float:浮点值
6. integer:整型值
7. string:字符串
8. fraction:百分数
9. enum:枚举值
10. flag:位或运算 

具体的用法 更详细的内容 可以参考这片文章, 这些  format都介绍的很详细


2. 使用自定义的 attr属性
为了让布局文件能够认识我们定义的属性, 不至于我们在写这些自定义的属性报错是, 需要加入如下schemas:
http://schemas.android.com/apk/res/[your package name]
例子如下: 
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.zuimeia.imagewidthnumview.ImageWithNumView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:textColor="@color/blue"
        app:textSize="13sp"/>
</RelativeLayout>

旧的官方文档建议使用使用第一种,  
但现在建议使用第二种  (Android Studio 强烈建议使用第二种)自动去寻找哪些属性,  就是 代码提示好像有点问题 

3. 读取attr
我们在xml 定义了 属性, 需要在View 中读取出这些属性 例子如下: 
public ImageWithNumView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);
    int textColor = a.getColor(R.styleable.MyView_textColor, 0XFFFFFFFF);
    float textSize = a.getDimension(R.styleable.MyView_textSize, 36);
    LogUtil.d(TAG, "textColor = " + textColor);
    LogUtil.d(TAG, "textSize = " + textSize);

}

通过上面的方式 就可以读取我定义的attr属性了
AttributeSet 相关文档, 里面还有一些其他相关的方法


通过AttributeSet 获取定义的宽高: 
for (int i = 0; i < attrs.getAttributeCount(); i++) {
    if ("layout_height".equals(attrs.getAttributeName(i))) {
        String h = attrs.getAttributeValue(i);
        LogUtil.d(TAG, "h = " + h);
    } else if ("layout_width".equals(attrs.getAttributeName(i))) {
        String w = attrs.getAttributeValue(i);
        LogUtil.d(TAG, "w = " + w);
    }
}
打出来的log 是这样的:
ImageWithNumView: w = 10.0dip
ImageWithNumView: h = 20.0dip














Android中attr详解

在学习attr用法之前先介绍TypedArray类的用法1、TypedArray类让我们先来看看源码中对TypedArray的解释: 大概意识是:包含函数 obtainStyledAttribu...
  • u012975705
  • u012975705
  • 2015年09月24日 20:00
  • 7527

Android - Attr、Style、Theme浅析

Android - Attr、Style、Theme浅析  ——念念不往,坚持你所坚持的。    学习Android也将近有一年多的时间了。在这一年里,从一个什么都不懂的小白,逐渐转变成为一个初级...
  • Hankins_Pan
  • Hankins_Pan
  • 2016年10月31日 21:35
  • 701

android 之 Attr的使用

最近在学习过程中遇到这个问题,不知道TypedArray是干嘛用的?去官方网站看一下吧:TypedArray继承自Object类,然后再看下它的类概述: [java] view ...
  • csf993981061
  • csf993981061
  • 2014年04月16日 11:10
  • 2718

Android,如何在代码中获取attr属性的值

获取arrt的值有时候我们需要把颜色,数值写成attr属性,这样做是为了屏蔽开发者对应具体数值,比如我们需要设置不同主题下的主色,副色,或者是不同版本的ActionBar大小,亦或者是不同Dpi下的D...
  • rrrrrr123rrr
  • rrrrrr123rrr
  • 2017年03月01日 01:51
  • 710

android studio中?attr报错的问题

偶尔会遇到android studio中?attr报错的问题,但是这个写法是没有问题的 如果遇到了直接改成?即可。 如图...
  • m0_37184603
  • m0_37184603
  • 2017年05月29日 15:45
  • 481

android中?attr/**与@drawable/**或@color/**等的区别

今天在写一个Demo的时候,突然遇到?attr/colorPrimary这个用法,一百度,竟然全网都是同一篇文章, 我苦思冥想,最终还搬出了Android源码,终于知道了意思,暂且记下来,作为备...
  • RuingMan
  • RuingMan
  • 2016年10月08日 17:38
  • 5932

Android中attr自定义标签详解

xmlns:wen=http://schemas.android.com/apk/res/com.iteye.googlers     android:orientation="vertical...
  • yuxiaohui78
  • yuxiaohui78
  • 2014年04月05日 05:35
  • 8854

Android attr属性的定义/读取/出错/使用

有人认为它可以直接通过在代码类中进行set...(),然后去改变View中的字体大小,颜色等等属性。 那如果要直接在引用布局Layout对其进行设置属性该怎么办呢? 这就是本文重点要介绍的内容:自定义...
  • qq_30552993
  • qq_30552993
  • 2017年02月16日 15:44
  • 2645

Android中 @和?区别以及?attr/**与@style/**等的区别

@和?的区别引用资源时,使用@还是?的区别,例如在设置style的时候既可以使用@也可以使用? style="?android:attr/progressBarStyleHorizontal" st...
  • xx326664162
  • xx326664162
  • 2017年03月20日 14:45
  • 2074

Android 属性(attr)引用

前言经常我们在布局文件中能看到以这样的方式指定某些属性: ...
  • FengShanChuiChui
  • FengShanChuiChui
  • 2017年05月26日 18:08
  • 504
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 自定义 attr属性
举报原因:
原因补充:

(最多只允许输入30个字)