最近在写项目的页面,然后使用到了复合控件,平常看了不少自定义view方面的知识,自己真正在项目中实践出总结总是最记忆深刻的。 复合控件可以创建出具有重用功能的控件集合,通常要继承一个合适的ViewGroup,再给它添加指定功能的控件,从而组成新的复合控件,一般来说,我们会给它指定一些可配置的属性,让它更具有拓展性。 之所以会使用到此控件捏,是因为程序中有一些共通的UI界面,比如说就是标题栏啦,我这里是事例不是标题栏,比如就是说下图,像列表一样,我这里不由listview去实现,感觉有点麻烦,就直接通过一个个控件写出来的,然而这每一条又那么类似,只是换个图片文字,或者是文字颜色是否有文字来着,一个个复制粘贴就冗余了很多代码,于是就开始着手,写个组合控件。 项目截图 定义属性 values -> attrs.xml,根据需求来,名字自取,我这里定义了图片、标题名及它的颜色,附加的文字名及颜色,暂时这几个属性就足够了,当然文字的大小,图片的大小也是可以定义的,如果需要更改的话,方式是一样的,未来需要再添加也是可以的,暂时这几个属性就能满足现有需求了。 <declare-styleable name="MyStripMenuView"> <attr name="imgSrc" format="reference"/> <attr name="textName" format="string"/> <attr name="textNameColor" format="color"/> <attr name="textAddition" format="string"/> <attr name="textAdditionColor" format="color"/> </declare-styleable> 代码中通过<declare-styleable>标签声明使用自定义属性,通过name属性来确定引用的名称,通过<attr>标签声明具体的自定义属性,注意,有些属性可以可以是具体颜色,也可以是一张图片,此时用“|”来分隔不同的属性——“reference|color”。 view_mystrip.xml(这里有的共用样式写在其他文件,大概布局也就这样了) 截图取于项目 MyStripMenuView.javapublic class MyStripMenuView extends RelativeLayout { private ImageView imgSign; private TextView tvName; private TextView tvAddition; private String name; private String addition; public MyStripMenuView(Context context) { this(context, null); } public MyStripMenuView(Context context, AttributeSet attrs) { super(context, attrs); // 将自定义组合控件的布局渲染成View View view = View.inflate(context, R.layout.view_mystrip, this); imgSign = (ImageView) view.findViewById(R.id.img_mystrip_sign); tvName = (TextView) view.findViewById(R.id.tv_mystrip_name); tvAddition = (TextView) view.findViewById(R.id.tv_mystrip_addition); // 加载自定义的属性并设置 TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyStripMenuView); name = a.getString(R.styleable.MyStripMenuView_textName); tvName.setText(name); tvName.setTextColor(a.getColor(R.styleable.MyStripMenuView_textNameColor, ContextCompat.getColor(context, R.color.GrayDeep02))); Drawable drawable = a.getDrawable(R.styleable.MyStripMenuView_imgSrc); imgSign.setImageDrawable(drawable); addition = a.getString(R.styleable.MyStripMenuView_textAddition); tvAddition.setText(addition); tvAddition.setTextColor(a.getColor(R.styleable.MyStripMenuView_textAdditionColor, ContextCompat.getColor(context, R.color.Pink01))); } // 设置附加的文字内容,根据需求来,这个文字是在代码中通过网络动态获取的,所以暴露此方法动态设置 public void setAdditionText(String addition){ tvAddition.setText(addition); } } 系统提供了TypedArray 数据结构来获取自定义属性集,后面引用的styleable的MyStripMenuView就是在xml中通过<declare-styleable name="MyStripMenuView">所指的name名。然后通过TypedArray 对象的getString()、getColor()等方法,就可以获取到这些定义的属性值,然后设置给单独的控件。 引用以及预览图代码截图 效果图 总结 当然我这里是很简单的组合控件,大致过程是这样子,需求只是这样,它的点击事情就是整体,所以也不要定义接口来实现组合控件内部控件的点击事件。若是有需求动态的拿到内部控件的点击事件,则需要定义个接口,然后在代码中暴露此接口,为控件增加点击事件而不去实现,而是调用接口中相应的点击方法,然后调用者实现这样一个接口,调用暴露的方法,将接口对象传递进去,完成回调就OK了~ 最后(记录下attrs.xml中的属性的format(类型)说明)
属性定义时可以指定多种类型值 (责任编辑:好模板) |