欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android自定义控件之自定义属性

程序员文章站 2022-06-09 08:20:41
...

自定义属性

resvalues目录下的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" />

自定义控件中使用

自定义的控件必须至少重写一个带有ContextAttributeSet的构造方法,我们就需要通过这两个属性来获取设置的自定义属性。核心方法是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();
        }
    }