首先xmlns是什么呢,它就是一个控件属性的命名空间,我们经常使用的命名空间有Android和app等,那么我们自己如何定义一个可用的命名空间呢?
1、首先我们在values文件夹下创建一个attrs.xml文件,创建完毕之后里面有一个自动生成的resources标签,我们要做的就是在这个resources标签下定义几个属性,代码是这样:
<resources>
<declare-styleable name="MyTextView">
<attr name="mytitle" format="string"/>
<attr name="mytitleTextSize" format="dimension"/>
<attr name="mytitleTextColor" format="color"/>
<attr name="myBackground" format="reference|color"/>
</declare-styleable>
</resources>
这个declare-styleable标签用来声明一组自定义属性,name属性代表这一组标签的名字,attr标签也就代表一个自定义属性,name属性代表这个自定义属性的名字,format属性代表这个自定义属性可以接受的类型。
format属性中我说明一下reference,这个代表的类型为引用类型,不仅可以是颜色,也可以是一张图片,也可以是其他资源。
这样我们就定义好了一组属性。
那么在自定义控件里如何使用这些属性获取属性值呢?
2、接下来我们需要重写自定义控件的构造方法,这里注意,不能重写只有一个参数的那个构造方法。
代码是这样的:
public MyTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
TypedArray ta=context.obtainStyledAttributes(attrs,R.styleable.MyTextView);//获取自定义属性组
title=ta.getString(R.styleable.MyTextView_mytitle);//获取mytitle属性值
ta.recycle();//回收ta
}
这里首先获取自定义属性组,然后获取自定义属性值,这样,我们就能获得此控件的任何一个属性的属性值。最后,一定要回收ta。
在这个代码中,获得的title值就能根据自己控件的需要进行操作了。
3、最后,我们需要定义一个xmlns命名空间,XML 命名空间定义语法为 xmlns:namespace-prefix = “namespaceURI”,一共分为三个部分:
xmlns:声明命名空间的保留字;
namespace-prefix:命名空间名;
namespaceURI:命名空间的唯一标识符,就是一个URI引用。
先看一下我定义的命名空间吧:
xmlns:test="http://schemas.android.com/apk/res-auto"
经过多次试验,url直接使用我这个url就可以,其他的博客可能说在后面加上包名什么的,都不管用!
所以我们只需要改一下我这个代码的test(命名空间名)就将xmlns定义好了。
随后,我们在自定义控件中就能使用这个命名空间下的属性了。
比如:
<com.demo.mql.mydemo.MyTextView
android:background="@color/colorPrimary"
test:mytitle="@string/app_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>