自定义属性
在res
的values
目录下的attrs.xml
文件中(没有就自己新建一个),使用<declare-styleable>
标签自定义属性。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--属性集合-->
<declare-styleable name="SearchView" >
<!--hint-->
<attr name="hint" format="string"/>
<!--搜索图标 可以通过typedArray.getResourceId获取资源id-->
<attr name="search_ico" format="reference" />
<!--清空图标-->
<attr name="clear_ico" format="reference" />
<!--语音图标-->
<attr name="voice_ico" format="reference" />
<!--输入类型-->
<attr name="input_type">
<!--value值只能是int类型的 所以获取时通过typeArray.getInt获取-->
<enum name="text" value="0"/>
<enum name="passwordText" value="1"/>
</attr>
<attr name="gravity">
<!--区别于enum enum只能选择一个 flag可以多选 如:left|top-->
<flag name="left" value="0" />
<flag name="top" value="1" />
<flag name="center" value="2" />
<flag name="right" value="3" />
<flag name="bottom" value="4" />
</attr>
</declare-styleable>
</resources>
其中declare-styleable
标签代表一个属性集合,name
属性要与自定义的控件同名。
attr
则是每条属性了,name
是属性值,format
是指定属性类型,目前可支持11种类型:
- reference:引用资源
- string:字符串
- Color:颜色
- boolean:布尔值
- dimension:尺寸值
- float:浮点型
- integer:整型
- fraction:百分数
- enum:枚举类型
- flag:位或运算
布局文件中使用
首先需要加上一个命名空间xmlns:app="http://schemas.android.com/apk/res-auto"
然后直接利用这个命名空间设置属性即可
<com.searchview.SearchView
android:id="@+id/searchView"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:hint="aaa"
app:search_ico="@drawable/ic_search"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
自定义控件中使用
自定义的控件必须至少重写一个带有Context
和AttributeSet
的构造方法,我们就需要通过这两个属性来获取设置的自定义属性。核心方法是context.obtainStyledAttributes(attrs, R.styleable.SearchView)
private void initParams(Context context, AttributeSet attrs) {
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.SearchView);
if (typedArray != null) {
String hint = typedArray.getString(R.styleable.SearchView_hint);
if (hint != null) {
et_input.setHint(hint);
}
Drawable clear_ico = typedArray.getDrawable(R.styleable.SearchView_clear_ico);
if (clear_ico != null) {
ib_cancle.setBackground(clear_ico);
}
Drawable voice_ico = typedArray.getDrawable(R.styleable.SearchView_voice_ico);
if (clear_ico != null) {
ib_voice.setBackground(voice_ico);
}
Drawable search_ico = typedArray.getDrawable(R.styleable.SearchView_search_ico);
if (clear_ico != null) {
this.search_ico.setImageDrawable(search_ico);
}
typedArray.recycle();
}
}
网友评论