Android组合控件的实战项目笔录

最近在写项目的页面,然后使用到了复合控件,平常看了不少自定义view方面的知识,自己真正在项目中实践出总结总是最记忆深刻的。

复合控件可以创建出具有重用功能的控件集合,通常要继承一个合适的ViewGroup,再给它添加指定功能的控件,从而组成新的复合控件,一般来说,我们会给它指定一些可配置的属性,让它更具有拓展性。

之所以会使用到此控件捏,是因为程序中有一些共通的UI界面,比如说就是标题栏啦,我这里是事例不是标题栏,比如就是说下图,像列表一样,我这里不由listview去实现,感觉有点麻烦,就直接通过一个个控件写出来的,然而这每一条又那么类似,只是换个图片文字,或者是文字颜色是否有文字来着,一个个复制粘贴就冗余了很多代码,于是就开始着手,写个组合控件。

Android组合控件的实战项目笔录_第1张图片
项目截图
定义属性
values -> attrs.xml,根据需求来,名字自取,我这里定义了图片、标题名及它的颜色,附加的文字名及颜色,暂时这几个属性就足够了,当然文字的大小,图片的大小也是可以定义的,如果需要更改的话,方式是一样的,未来需要再添加也是可以的,暂时这几个属性就能满足现有需求了。


        
        
        
        
        

代码中通过标签声明使用自定义属性,通过name属性来确定引用的名称,通过标签声明具体的自定义属性,注意,有些属性可以可以是具体颜色,也可以是一张图片,此时用“|”来分隔不同的属性——“reference|color”。

view_mystrip.xml (这里有的共用样式写在其他文件,大概布局也就这样了)

Android组合控件的实战项目笔录_第2张图片
截图取于项目
MyStripMenuView.java

    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中通过所指的name名。然后通过TypedArray 对象的getString()、getColor()等方法,就可以获取到这些定义的属性值,然后设置给单独的控件。

引用以及预览图

Android组合控件的实战项目笔录_第3张图片
代码截图

效果图

总结
当然我这里是很简单的组合控件,大致过程是这样子,需求只是这样,它的点击事情就是整体,所以也不要定义接口来实现组合控件内部控件的点击事件。若是有需求动态的拿到内部控件的点击事件,则需要定义个接口,然后在代码中暴露此接口,为控件增加点击事件而不去实现,而是调用接口中相应的点击方法,然后调用者实现这样一个接口,调用暴露的方法,将接口对象传递进去,完成回调就OK了~

最后 (记录下attrs.xml中的属性的format(类型)说明)

  1. reference:参考某一资源ID
  2. color:颜色值
  3. boolean:布尔值
  4. dimension:尺寸值
  5. float:浮点值
  6. integer:整型值
  7. string:字符串
  8. fraction:百分数
  9. enum:枚举值
  10. flag:位或运算

属性定义时可以指定多种类型值

你可能感兴趣的:(Android组合控件的实战项目笔录)