有些应用场景需要我们给现有的控件增加一些属性,优雅的实现预期效果,本文简单描述自定义属性的基本使用方法。
例子:给TextView增加一个 “选中” 和 “未选中” 显示不同的背景的属性
<resources>
<declare-styleable name="img_attr">
<attr name="before" format="reference"/>
<attr name="after" format="reference"/>
declare-styleable>
resources>
直接上代码:用代码说
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));
}
}
}
<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>
MyTextView ms=(MyTextView)findViewById(R.id.colorView1);
//选中
ms.setSelect(context,true);
//不选中
ms.setSelect(context,false);
不需要你写很多setBackgrund的逻辑