自定义view的自定义属性

今天研究了一下自定义view上使用自定义的属性的问题,幸运的让我触类旁通了很多东西,解释了好几个我一直没明白或者困惑的问题。记录一下以备后用。
1.首先要让自定义view使用自定义属性值,需要先建立自己的view和自己的属性值,自定义view我就不说了,因为不是本文要说的内容。自定义属性值就是在values目录下建立一个文件,名字随意,一般叫attrs.xml  。然后里面加上类似下面的代码:
<?xml version="1.0" encoding="utf-8"?>   
<resources>   
    <declare-styleable name="aaa">   
        <attr name="bbb" format="dimension" />   
        <attr name="ccc" format="string" />   
    </declare-styleable>   
</resources>


为啥名字随意呢? 这个就解决了我一直很混乱的问题。
values文件夹最常用的就是string.xml ,你把string.xml改成aaa.xml,程序不会报任何异常。
或者你把colors.xml里面的东西全部copy到string.xml里,再把colors.xml文件删掉,程序一切正常。
OK,那不用我说大家也明白了,文件名只是程序员用来分组的,只要自己用着舒服就行了,Android内部代码不会根据你的文件名来做东西,而是根据你的属性名称来区分的。你完全可以把values底下所有的文件都搞到一个文件中,并且这个文件名字随意。 比如:
<string name="app_name">ViewPropertyCustom</string>
<style name="AppBaseTheme" parent="android:Theme.Light">
这两个一个是代表string,一个是代表style。他们完全可以放到一个文件中,但是Android会根据名称不同来做不同的用途。

2.知道了上面的道理以后,一切看起来简单了许多。我们在属性值里加入了declare-styleable这么个标签,然后定义了两个attr,name分别是aaa和bbb。用的时候首先在layout的xml文件中加上如下代码:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity"
     xmlns:myapp="http://schemas.android.com/apk/res/com.example.viewpropertycustom" 
     >

    <com.example.viewpropertycustom.MyTextView
        android:text="@string/app_name"
        android:id="@+id/my_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/black"
        android:gravity="center"
         myapp:bbb="20sp"
         />
</RelativeLayout>


这里也有一个很好的问题,加上了命名空间xmlns:myapp,名字随意,可以是xmlns:xxx 。然后后面的 http://schemas.android.com/apk/res/ 固定,再后面跟包名。用的时候下面直接加上myapp:bbb即可。表示在这个包(也就是我们自己的包)下定义的一个declare-styleable里的一个名为bbb的attr。
然后大家也就知道了所有的layout xml中最顶上都会有这么一句:xmlns:android="http://schemas.android.com/apk/res/android 的含义了,其实我可以把xmlns:android改成xmlns:aaa 。然后下面的android:layout_width相应的改成 aaa:layout_width 即可,程序不会报错。

3.然后直接在自定义view中加上如下代码:
        TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.aaa);
        float a=typedArray.getDimension(R.styleable.aaa_bbb, 15);
        this.setTextSize(a); 
这样,就能取到自定义的属性的值,然后进行相关赋值操作了。你可能觉得这段代码怪怪的,有点繁琐,其实去翻看View的源码,发现View的构造方法里也是这么搞的,一模一样。

好,自定义view的自定义属性问题就是这样。通过这个看似小的问题真是学到了不少东西,远比本身这个知识点更有用。附件是一个很简单demo。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值