美文网首页Android
Android自定义控件之自定义属性

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

作者: 12313凯皇 | 来源:发表于2019-02-03 13:11 被阅读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();
            }
        }
    

    相关文章

      网友评论

        本文标题:Android自定义控件之自定义属性

        本文链接:https://www.haomeiwen.com/subject/jwuysqtx.html