Android自定义View(三)自定义属性AttributeSet

article/2025/10/7 3:25:06

       自定义View的时候通常需要提供一些自定义属性,自定义属性非常简单,只需要在res资源目录的values目录下创建一个attrs.xml的属性定义文件,然后在该文件中定义相应的属性,并在自定义View的构造函数中获取并设置自定义属性的默认值即可。

       假设在attrs.xml中自定义如下属性:

    <declare-styleable name="CustomView"><attr name="property" format="String"/></declare-styleable>

        declare-styleable标签中的name代表自定义View的类名,而attr标签中的name表示自定义属性的名称,format表示自定义属性的类型,format的取值如下图所示:

        这里将一一介绍自定义属性的每种类型以及如何在自定义View的构造函数中获取该类型的属性:

一、string类型

        1、在attrs.xml中定义属性为string类型:

    <attr name="property" format="String"/>

        2、相应的在自定义View的构造函数中可以通过如下方式获取:

    private String property;public CustomView(Context context, AttributeSet attrs) {super(context, attrs);TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);property = ta.getString(R.styleable.CustomView_property);}

              首先通过Context的obtainStyledAttributes方法获取TypedArray,再通过getString获取自定义属性property;

        3、然后就可以在布局文件中设置自定义属性了。

    <com.exam.customview.CustomViewandroid:layout_width="match_parent"android:layout_height="match_parent"app:property="test" />

  二、boolean类型

        1、在attrs.xml中定义属性为boolean类型:

    <attr name="property" format="boolean" />

        2、在自定义View的构造函数中通过如下方式获取:

    private boolean property;TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);property = ta.getBoolean(R.styleable.CustomView_property, false);

              通过TypedArray的getBoolean方法获取自定义属性,同时设置属性的默认值。

        3、在布局文件中设置自定义属性:

三、dimension类型

        1、在attrs.xml中定义属性为dimension类型,即设置属性为尺寸类型:

    <attr name="property" format="dimension" />

        2、在自定义View的构造函数中通过如下方式获取:

    private float property;TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);property = ta.getDimension(R.styleable.CustomView_property, 10.0f);

             通过TypedArray的getDimension方法获取自定义属性,同时设置属性的默认值。

        3、在布局文件中设置自定义属性:

    app:property="1dp"

四、float类型

        1、在attrs.xml中定义属性为float类型:

    <attr name="property" format="float" />

        2、在自定义View的构造函数中通过如下方式获取:

    private float property;TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);property = ta.getFloat(R.styleable.CustomView_property, 0.0f);

             通过TypedArray的getFloat方法获取自定义属性,同时设置属性的默认值。

        3、在布局文件中设置自定义属性:

    app:property="0.8" 

五、integer类型

        1、在attrs.xml中定义属性为integer类型:

    <attr name="property" format="integer" />

        2、在自定义View的构造函数中通过如下方式获取:

    private int property;TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);property = ta.getInt(R.styleable.CustomView_property, 0);

             通过TypedArray的getInt方法获取自定义属性,同时设置属性的默认值。

        3、在布局文件中设置自定义属性:

    app:property="10"

六、enum类型

        1、在attrs.xml中定义属性为enum类型,即设置属性为枚举类型,枚举类型需要通过enum标签指定枚举的常量,假设自定义一个属性location,它有五个常量:left、right、top、bottom、center,其在attrs.xml中的结构如下:

    <attr name="location" format="enum"><enum name="left" value="0" /><enum name="right" value="1" /><enum name="top" value="2" /><enum name="bottom" value="3" /><enum name="center" value="4" /></attr>

        enum标签中name代表枚举的常量,值得注意的是,value指的是枚举常量对应的值,因为TypedArray中并不存在类似的getEnum方法来获取枚举类型的属性,所以在获取枚举类型的属性时是通过value值来获取并设置默认值,比如可以指定value为Int类型然后通过TypedArray的getInt获取。

        2、在自定义View的构造函数中通过如下方式获取:

    private int location;TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);location = ta.getInt(R.styleable.CustomView_location, 0);

             通过TypedArray的getInt方法获取枚举类型的属性,同时设置属性的默认值,这里的默认值为枚举常量对应的value值。

        3、在布局文件中设置自定义属性:

七、color类型

        1、在attrs.xml中定义属性为color类型:

    <attr name="property" format="color" />

        2、在自定义View的构造函数中通过如下方式获取:

    private int property;TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);property = ta.getColor(R.styleable.CustomView_property, Color.parseColor("#FFFFFF"));

             通过TypedArray的getColor方法获取自定义属性,同时设置属性的默认值。

        3、在布局文件中设置自定义属性:

    app:property="#000000"

八、reference类型

        在attrs.xml中定义属性为reference类型,reference表示一个资源id,通常可以用来引用一张图片(drawable)或字符串数组(string-array):

    <attr name="property" format="reference" />

        当用来引用一张图片或Drawable类型的资源(如ShapeDrawable)时,在自定义View的构造函数中需要将属性设置为Drawable类型,并通过TypedArray的getDrawable方法获取:

private Drawable property;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
property = ta.getDrawable(R.styleable.CustomView_property);

        在布局文件中设置自定义属性:

app:property="@mipmap/demo"

        当用来引用字符串数组时,在自定义View的构造函数中需要将属性设置为CharSequence[]数组类型,并通过TypedArray的getTextArray方法获取:

private CharSequence[] property;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
property = ta.getTextArray(R.styleable.CustomView_property);

        在布局文件中设置自定义属性:

app:property="@array/item"

九、flags类型

        flags类型用于进行位或运算,可以指定并存的属性值,即支持app:property="option1|option2"的格式声明,app:property属性的取值既可以是option1或者是option2。举个例子,在Android开发中为了避免屏幕旋转导致Activity重新创建,可以通过指定android:configChanges="orientation|keyboardHidden|screenSize"来实现。

        这个属性的用法和enum类型是有些许相似的地方,主要区别在于flags类型支持指定有限的几个属性值中的一个值或多个值并存的形式,但是enum类型只能指定有限的几个属性值中的一个取值。它的使用方法如下:

        1、在attrs.xml中定义属性为flags类型:

<attr name="property" format="flags"><flag name="option1" value="0" /><flag name="option2" value="1" /><flag name="option3" value="2" /><flag name="option4" value="3" /><flag name="option5" value="4" />
</attr>

        2、在自定义View的构造函数中通过如下方式获取:

private int property;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
property = ta.getInt(R.styleable.CustomView_property, 0);

        3、在布局文件中设置自定义属性:

app:property="option1|option3|option5"

十、fraction类型

        1、在attrs.xml中定义属性为fraction类型,即设置属性为百分比数值类型:

<attr name="property" format="fraction" />

        2、在自定义View的构造函数中通过如下方式获取:

private float property;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
property = ta.getFraction(R.styleable.CustomView_property, 1, 1, 0);

        3、在布局文件中设置自定义属性:

app:property="30%p"
app:property="30%"

       如上所示,百分比属性支持两种形态的百分比声明:

       100% 表示相对于对象自身的百分比;

       100%p 表示相对于父容器的百分比;

       在构造函数中可以通过TypedArray的getFraction方法来获取百分比数值的属性,getFraction方法原型如下:

public float getFraction(@StyleableRes int index, int base, int pbase, float defValue)

      index:在attrs.xml中定义的资源id;

      base:该分数的基值,一般来说百分比属性对应的具体数值等于该分数乘以该基值,比如设置属性app:property="30%",设置基值base为1,则属性对应的具体值为相当于对象自身的30%,即0.3乘以1;而如果设置属性app:property="30%",设置基值为5的话,那么属性对应的具体值并不是对象自身的30%,而是0.3乘以5,即150%。为了更直观的展示该类型的属性,在构造函数中通过getFraction获取该类型的值时设置base为1即可;

       pbase:该分数的父基值,一般来说百分比属性对应的具体数值等于该分数乘以该父基值,比如设置属性app:property="30%p",设置基值pbase为1,则属性对应的具体值为相当于父容器的30%,即0.3乘以1,一般设为1即可;

       defValue:未设置属性时的默认值。

十一、组合类型

        1、比如需要设置背景既可以是颜色或者是一张图片,则可以在attrs.xml中定义如下:

<attr name="background_property" format="color|reference" />

        2、在自定义View的构造函数中通过如下方式获取:

private Drawable backgroundProperty;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
backgroundProperty = ta.getDrawable(R.styleable.CustomView_background_property);

        在自定义VIew中可以通过instanceof区分是颜色还是图片类型的属性:

if (backgroundProperty instanceof ColorDrawable) {//执行相应操作
} else if (backgroundProperty instanceof BitmapDrawable) {//执行相应操作
}

        3、然后就可以在布局文件中设置自定义属性为颜色类型:

app:background_property="#000000"

             或者设置属性为图片类型:

app:background_property="@mipmap/demo"

  十二、系统属性

        1、有时候我们并不想自定义属性名称,而是想重用系统属性名称,比如自定义了一个控件,它有一个显示多少行的属性,我们知道系统有一个android:maxLines属性,那如何去重用这个属性呢?其实还是一样的,先在attrs.xml中定义属性:

<attr name="android:maxLines" format="integer" />

        2、在自定义View的构造函数中通过如下方式获取:

private int maxLines;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.CustomView);
maxLines = ta.getInt(R.styleable.CustomView_android_maxLines, 1);

        3、然后就可以像TextView一样在布局文件中使用:

android:maxLines="1"

        下一节将介绍Android中Paint的常用方法。


http://chatgpt.dhexx.cn/article/AwkRyCAA.shtml

相关文章

web搜索框的制作(必应)

前两天没事突然对搜索来了兴趣&#xff0c;我一直在想搜索框中我们输入一些字或者字母&#xff0c;为何下面就会有一些自动补齐的相关搜索&#xff0c;比如我在搜索输入框中输入一个字母e&#xff0c;下面就会出现饿了么&#xff0c;e租宝&#xff0c;ems等相关的搜索链接。然后…

html怎么调搜索框宽高,百度站内搜索css:输入框宽度及样式自定义

近日网站使用了百度站内搜索api&#xff0c;目的是为了提高站内搜索的速度&#xff0c;减轻查询站内数据库带来的服务器压力。 不过在使用百度站内搜索api(生效范围&#xff1a;*webkaka.com/*)后发现一个问题&#xff0c;不同的频道模版造成排版不合适的后果&#xff0c;如搜索…

织梦手机站站内搜索

今天在做手机网站发现一个问题&#xff0c;当在手机是使用搜索功能时马上就跳转到电脑端网站去了&#xff0c;在手机上无法使用。在网上找半天没有找到解决的办法&#xff0c;后来自己想通了&#xff0c;下面告诉大家怎么样简单的实现这个功能&#xff01;我的手机站是在m/这个…

基于 Elasticsearch 的站内搜索引擎实战

站内搜索&#xff0c;可以认为是针对一个网站特性内容的搜索功能。由于内容、格式可控&#xff0c;站内搜索比全网搜索的实现要简单很多。 简书这个网站本身自带一个搜索&#xff0c;但是缺乏针对个人文章的搜索&#xff0c;所以本文的实战内容是解决这个痛点。 代码在 https…

使用swiftype实现站内搜索

本人博客opiece.me&#xff0c;欢迎访问。 前言 首先&#xff0c;以下的内容是基于最新的swifytpe的教程&#xff0c;应该是2.0.0。 站内搜索顾名思义就是将范围限定在你的网站内&#xff0c;以此范围进行关键字搜索。 常见的站内搜索是google和baidu的&#xff0c;但是现在…

Compass实战 站内搜索

今天早上打算对这两天学习的Lucene以及Compass总结一下,想来想去,还是写个小项目来验证最好了。于是就有了今天的这篇文章。难易程度适合对于Compass或者Lucene刚入门的童鞋,大牛看到后望轻喷 :-) 项目预览项目需求项目目录核心处理 发帖部分查询部分总结项目预览 项目需求 …

html中的搜索

目录 hello&#x1f604; form表单&#x1f349; form的语法&#x1f34a; from的属性&#x1f34a; 提交&#xff1f;重置&#xff1f;&#x1f34a; 表单按钮&#xff08;html&#xff09;&#x1f50d; JavaScript提交表单&#x1f50d; JavaScript重置表单&#x1f…

必应(Bing)的站内搜索 site:<域名> <搜索内容>

最近在备考OCP&#xff0c;发现有一个网站的题库很好&#xff0c;就是www.examtopics.com&#xff0c;有很多Oracle的考题&#xff0c;都是在这里面搜到的&#xff0c;而且每道题都有人讨论。 为了加快搜索速度&#xff0c;提高精度&#xff0c;可以用Bing在这个网站内搜索&am…

百度站内搜索使用教程

最近做了一个博客CMS网站&#xff0c;用到了百度站内搜索&#xff0c;做一些必要的笔记&#xff0c;一来是对自己学习的知识的巩固&#xff0c;二来对有同样问题的人有参考作用 文章目录 一 使自己的网站被百度收录二 获取百度站内搜索代码三 总结 声明一下&#xff0c;我本人很…

利用免费的必应 Bing 自定义搜索打造站内全文搜索

简介 百度的站内搜索不做了&#xff0c;唉&#xff0c;果然免费的不永久。我们看看 Bing 的&#xff0c;每个月有 1000 次免费的调用 bing search api 的次数。不同客户可以多申请几个就行了。 申请入口&#xff1a; https://www.customsearch.ai&#xff0c;官方简介页面官方…

html百度站内搜索代码,网站添加百度站内搜索的教程

zblog博客程序中可以在侧边栏中添加搜索功能&#xff0c;但是让人郁闷的是如果没针对搜索使用搜索插件&#xff0c;那情况简直让人抓狂&#xff0c;还好我们可以使用百度的站内搜索功能&#xff0c;一方面可以节省网站的资源&#xff0c;另一方面可以增加百度的收率几率。 关于…

站内搜索

使用“site:”或者“domain:”来实现站内搜索 如果你想在一个特定的网站上来进行搜索&#xff0c;在众多庞大的信息流中找到你想要的信息&#xff0c; 在上篇中(http://blog.csdn.net/liunian02050328/article/details/8220379)介绍在java编程的环境下实现站内搜索&#xff0c;…

计算机网络中的ping什么意思,PING命令是什么?PING使用方法和参数详解

PING命令是用来检查本机于网络上的电脑是否正常通信的一个命令&#xff0c;作为一个网站的管理员、单位的网管这也是一个必会的命令。 因为网络中所有的电脑都有一个单独不会重复的IP地址&#xff0c;我们使用PING命令给目标IP地址发送一个数据包&#xff0c;对方就要返回一个同…

常见的ping命令

1.ping 延时和丢包 开始--运行---输入cmd---输入ping IP&#xff08;IP为所要ping的服务器的IP&#xff09; 常与 -t 选项结合使用 ctrlc结束 延时主要看时间列 看时间得数值和波动 丢包 ---出现请求超时 2.追踪路由 tracert IP 注意&#xff1a; 追路由 --一般追3次 …

ping命令常见参数使用详解

winR 输入cmd 回车 进入命令窗口 输入ping baidu.com 回车可以查看网络连接。 ping [-t]参数是用来不断的ping对方主机&#xff0c;直到手动停止&#xff0c;使用ctrlc。Windows默认是四次停止。 [-l]&#xff08;-L&#xff09;参数用来设定数据包的大小的&#xff0c;在默认的…

Linux 常用ping命令详解

一、用法 Usage: ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface][-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos][-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option][-w deadline] [-W timeout] [hop1 ...] destination二…

CentOS7里ping命令详解

ping 功能简述&#xff1a;Linux系统的ping命令是常用的网络命令&#xff0c;它通常用来测试与目标主机的连通性&#xff0c;我们经常会说“ping一下某机器&#xff0c;看是不是开着”、不能打开网页时会说“你先ping网关地址192.168.1.1试试”。它通过发送ICMPECHO_REQUEST数…

ping命令

在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为&#xff1a; &#xff08;1&#xff09;用来检测网络的连通情况和分析网络速度&#xff1b;&#xff08;2&#xff09;根据域名得到服务器IP&#xff1b;&#xff08;3&#xff09;根据ping返回的TTL值来判断对方所使…

Ping命令的用法

ping基本使用详解 在网络中ping是一个十分强大的TCP/IP工具。它的作用主要为&#xff1a; &#xff08;1&#xff09;用来检测网络的连通情况和分析网络速度&#xff1b; &#xff08;2&#xff09;根据域名得到服务器IP&#xff1b; &#xff08;3&#xff09;根据ping返回…

ping命令简单总结

ping测失败是最长出现的网络故障&#xff0c;面对ping不通的问题&#xff0c;需要有一个排查顺序&#xff0c;接下来就简单总结下&#xff1a; 1、ping命令简介 当192.168.1.1向192.168.1.2发出ping测&#xff0c;ping命令生成固定格式的ICMP数据请求包&#xff0c;ICMP协议将…