在我们自定义View的时候 现在的 属性 (width height) 不能满足 控件需要的时候 我们需要自定义属性:
首先们 新建一个View继承自view
package com.example.automaticattrs.view;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
public class PercentView extends View {
public PercentView(Context context, AttributeSet attrs) {
super(context, attrs);
}
}
然后我们在项目目录 values 文件夹下新建一个attrs.xml
如下:
这里的 结点 还有下面的 name 和format 都不会的提示 全靠 我们手动敲出来 attrs是定义属性名和格式的地方,需要用包围所有属性。其中name为该属性集的名字,主要用途是标识该属性集。 这里的name 是我自定义View的名字,这个name 可以随便写 但为了标识 我就用了 自定义view的名字。
这里的format 可以用到的类型为:string , integer , dimension , reference , color , enum.
那么如何定义一个枚举呢:
<attr name="testEnum">
<enum name="fill_parent" value="-1"/>
<enum name="wrap_content" value="-2"/>
</attr>
如果该属性可同时传两种不同的属性,则可以用“|”分割开即可。
在布布局中如何使用?
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:huwen="http://schemas.android.com/apk/res/com.example.automaticattrs"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.example.automaticattrs.view.PercentView
android:layout_width="match_parent"
android:layout_height="wrap_content"
huwen:text="hao"
huwen:testAttr="20"
></com.example.automaticattrs.view.PercentView>
</RelativeLayout>
这个命名空间一个要写上,不然我们的自己定义属性是无法使用的。xmlns:huwen="http://schemas.android.com/apk/res/com.example.automaticattrs"
这个命名空间 可以直接 copy: xmlns:android="http://schemas.android.com/apk/res/android
把android去掉 在清单文件里找到我们包名 把Android 改成我们的包名就可以了:
这个xmlns:huwen
的 huwen 是可以随便写的 但 如果这里写成 xmlns:xxx
则 我们使用属性的时候就要写成 xxx:text="hao"
xxx:testAttr="20"
那我们如何在代码中获取这些值呢?
public class PercentView extends View {
public PercentView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.PercentView);
String string = a.getString(R.styleable.PercentView_text);
int integer = a.getInteger(R.styleable.PercentView_testAttr, 0);
Log.d("tag", string+":::::"+integer);
}
}
项目跑起来后:log出: