一.定义属性
在xml中定义你所需要的属性
有关于属性的介绍可以查看我之前的一篇文章:
https://blog.csdn.net/xxdw1992/article/details/78936532
二.源码
public class HeadView extends RelativeLayout {
private TextView title, rightTv;
private ImageView leftIv, rightIv;
private OnListener onListener;
public HeadView(Context context) {
this(context, null);
}
public HeadView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public HeadView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
intAttribute(context, attrs, defStyleAttr);
}
/**
* 初始化布局和属性
*/
private void intAttribute(Context context, AttributeSet attrs, int defStyleAttr) {
initView(context);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.HeadView);
String titlestr = typedArray.getString(R.styleable.HeadView_title);
String rightTvstr = typedArray.getString(R.styleable.HeadView_right_tv);
if (titlestr != null) {
title.setText(titlestr);
}
if (rightTvstr != null) {
rightTv.setText(rightTvstr);
}
boolean rightIvGone = typedArray.getBoolean(R.styleable.HeadView_rightivgone, false);
boolean leftIvGone = typedArray.getBoolean(R.styleable.HeadView_leftivgone, false);
int rightIvRes = typedArray.getResourceId(R.styleable.HeadView_right_iv, 0);
int leftIvRes = typedArray.getResourceId(R.styleable.HeadView_left_iv, 0);
/*如果设置左边Iv隐藏,则不设置背景 */
if (leftIvGone) {
leftIv.setVisibility(View.GONE);
} else {
leftIv.setImageResource(leftIvRes);
}
if (rightIvGone) {
rightIv.setVisibility(View.GONE);
} else {
rightIv.setImageResource(rightIvRes);
}
typedArray.recycle();
}
/**
* 初始化控件
*/
private void initView(Context context) {
View view = LayoutInflater.from(context).inflate(R.layout.headiew_layout, this, true);
title = view.findViewById(R.id.title_title);
leftIv = view.findViewById(R.id.title_leftiv);
rightIv = view.findViewById(R.id.right_iv);
rightTv = view.findViewById(R.id.right_tv);
leftIv.setOnClickListener(v -> onListener.leftIv());
rightIv.setOnClickListener(v -> onListener.rightIv());
rightTv.setOnClickListener(v -> onListener.rightTv());
}
public interface OnListener {
/**
* 左边图标监听
*/
void leftIv();
/**
* 右边图片监听
*/
default void rightIv() {
}
/**
* 右边文字监听
*/
default void rightTv() {
}
}
/**
* 设置监听的接口回调
*/
public void setOnViewClick(OnListener click) {
onListener = click;
}
//设置标题
public void setTitle(String str) {
if (!TextUtils.isEmpty(str)) {
title.setText(str);
}
}
//设置标题文字大小
public void setTitleSize(int size) {
if (title != null) {
title.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}
}
//设置右标题文字
public void setRightText(String s) {
if (!TextUtils.isEmpty(s)) {
rightTv.setText(s);
}
}
//设置右标题文字大小
public void setRightTextSize(int size) {
if (rightTv != null) {
rightTv.setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}
}
//设置左图标资源
public void setLeftDrawable(int res) {
if (leftIv != null) {
leftIv.setVisibility(View.VISIBLE);
leftIv.setImageResource(res);
}
}
//设置右图标资源
public void setRightDrawable(int res) {
if (rightIv != null) {
rightIv.setVisibility(View.VISIBLE);
rightIv.setImageResource(res);
}
}
}
三.XML中调用
四.注意事项
xml的入口是从第二构造函数进入的,由于我的方法是写在第三构造函数,要用this调用