• Android自定义属性的基本使用


    有些应用场景需要我们给现有的控件增加一些属性,优雅的实现预期效果,本文简单描述自定义属性的基本使用方法。

    例子:给TextView增加一个 “选中” 和 “未选中” 显示不同的背景的属性

    一、写属性

    1. 在values下新建一个名为attrs的xml文件。
      在这里插入图片描述
      2.在attrs.xml中定义自己的属性
    
    <resources>
        <declare-styleable name="img_attr">
            <attr name="before" format="reference"/>
            <attr name="after" format="reference"/>
        declare-styleable>
    resources>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、拿到属性实现功能

    直接上代码:用代码说

    package com.myApp.view;
    
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.widget.TextView;
    import androidx.annotation.Nullable;
    import androidx.core.content.ContextCompat;
    
    import com.android.launcher3.R;
    
    
    @SuppressLint("AppCompatCustomView")
    public class MyTextView extends TextView {
    
        public ColorViewL2(Context context) {
            this(context, null);
        }
    
        public ColorViewL2(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        protected int id_n = 0;
        protected int id_p = 0;
        public ColorViewL2(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            //1. 获取属性(本教程的关键所在)
            TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.img_attr);
            id_n = typedArray.getResourceId(R.styleable.img_attr_before, 0);//R.styleable.父名_子名
            id_p = typedArray.getResourceId(R.styleable.img_attr_after, 0);//R.styleable.父名_子名
            setSelect(context,false);
        }
    
        
        //2。复写TextView设置背景的方法
        @Override
        public void setBackground(Drawable background) {
            super.setBackground(background);
        }
    
        //3. 对外public这个View动态设置背景
        public void setSelect(Context context,boolean isSelect){
            if (isSelect){
                if (id_p!=0)setBackground(ContextCompat.getDrawable(context,id_p));
            }else {
                if (id_n!=0)setBackground(ContextCompat.getDrawable(context,id_n));
            }
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    三、使用方法

    1. 在你的布局头部加上这样一句代码:xmlns:myattrs=“http://schemas.android.com/apk/res-auto”

    2.在你的布局文件中就可以使用myattrs拿到你的定义的属性

    
    
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:myattrs="http://schemas.android.com/apk/res-auto"
        android:background="@drawable/__l2__ms_pedal_switch_bg">
    
    <com.myApp.view.MyTextView
                        android:id="@+id/colorView1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        myattrs:before="@drawable/img_1"
                        myattrs:after="@drawable/img_2" />
                        
    <com.myApp.view.MyTextView
                        android:id="@+id/colorView2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        myattrs:before="@drawable/img_3"
                        myattrs:after="@drawable/img_4" />
            
    RelativeLayout>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    四、最终效果

    MyTextView ms=(MyTextView)findViewById(R.id.colorView1);
    
    //选中
    ms.setSelect(context,true);
    
    //不选中
    ms.setSelect(context,false);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    不需要你写很多setBackgrund的逻辑

  • 相关阅读:
    html实现好看的导航主页(附源码)
    6-8 最宽层次结点数 分数 10
    GO语言网络编程(并发编程)原子操作(atomic包)
    伦敦现货黄金交易市场的历史与地位
    MATLAB算法实战应用案例精讲-【人工智能】ROS机器人(最终篇)
    深入浅出学习透析Nginx服务器的基本原理和配置指南「Keepalive性能分析实战篇」
    C++11=default,=delete
    通过netty实现scoket客户端
    FinClip小程序+Rust(三):一个加密钱包
    跨境电商独立站如何建立呢?
  • 原文地址:https://blog.csdn.net/qq_41008818/article/details/126308498