一、自定义View
因为Android系统内置的View无法实现我们需求,所以需要针对业务需求定制所需要的View,或者单种样式统一的布局出现在项目的多个地方,也可以把这个布局抽出来成自定义View。
这种头部标题栏经常会在布局中出现,多次定义太麻烦,用
include
每次都需要单独控制每个控件,所以把它抽成自定义控件可以进行属性统一管理,比较方便。
二、具体操作
- 自定义一个类继承自
FrameLayout
,重写三个方法,注意:
必须把前两个一个参数和两个参数方法的super
换成this
,不然在使用的时候自定义View不生效,并且在一个参数和两个参数的this的括号里分别增加个null 和 0; - 在第三个方法中加载自定义View的布局
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleBar);
View inflate = View.inflate(context, R.layout.titlebar, null);
addView(inflate);
- 在values文件下创建artts XML文件
自定义属性分别为控制自定义View的背景、自定义View中TextView的颜色、字体大小、是否显示 和 点击监听
<resources>
<declare-styleable name="TitleBar">
<attr name="titleBackgroundColor" format="color|reference" />
<attr name="tvLeftTextColor" format="color|reference" />
<attr name="tvRightTextSize" format="integer|dimension" />
<attr name="tvIsShowLeft" format="boolean" />
</declare-styleable>
</resources>
- 在自定义的类里找控件和获取
//找到控件
TextView mLeftTv = (TextView) itemView.findViewById(R.id.tv_left);
//获取使用中设置的参数,默认是false
boolean showLeft = typedArray.getBoolean(R.styleable.TitleBar_tvIsShowLeft, false);
//根据布局中设置的参数确定控件是现实还是隐藏
mLeftTv.setVisibility(!showLeft ? VISIBLE : INVISIBLE);
//获取传过来颜色,默认颜色
int tvLeftColor = typedArray.getColor(R.styleable.TitleBar_tvLeftTextColor, R.color.ColorWther);
//根据布局中设置的参数设置字体颜色
mLeftTv.setTextColor(tvLeftColor);
//获取传过来字体大小,默认字体大小(单位是px,源码中有px转dp和sp的操作)
float tvLeftSize = typedArray.getDimension(R.styleable.TitleBar_tvLefttTextSize, 16);
//根据布局中设置的参数设置字体大小
mLeftTv.setTextSize(tvLeftSize);
- 控件的点击监听和RecycleView的接口回调一样;