自定义view--进阶
上一篇说到的自定义view其实还比较简单,因为没有涉及到太多的接口提供给外部调用,这篇我们稍微深入一点,还是从废弃项目中拿出控件来实战。
在app中肯定会有一批控件是反复用到的,比如titlebar。以前大家喜欢写一个xml,然后在不同layout文件中include进来,然后在java代码中拿到view的引用后,设置不同的属性。这种方式其实不太好,你想想,比如你要设置titlebar上面文字的颜色,你要setColor。。。一串繁琐的代码,而且这种和业务没太大关系的代码,我们不希望占太大篇幅。ui嘛,就放到xml里设置个属性来搞定好了。请看下图这个需求
我们最终希望把它做成一个类似Button这样的控件,在xml中直接使用,至于文字、颜色、大小、间距这些属性,我们只需要在<TitleBar app:leftTitleSize="16sp" ....../>这样设置就好了。下面开始一步步来实现:
第一步:新建一个类继承View。这里根据具体业务,我们发现这个控件用相对布局比较方便,所以我们继承了RelativeLayout。对应的xml布局文件也排版完成。一会儿引用到Java类中
第二步:因为这个需求中,我们看到有很多属性需要定义,比如左边文字的颜色、文字大小,左边小图标icon的设置,右边文字颜色大小等,我们希望这种最终都能通过一句简短的属性来设置完成,所以,先自定义所有需要的属性集
第三步:在自定义控件的代码中暴露给外部,供外部操作
因为我们在控件中定义了一个叫做leftIcon的属性,所以在实际使用的时候,通过这种自定义属性方式能直接设置,如下:
当然,还可以通过java代码来设置(如果我们在自定义控件中暴露了对应的接口)如下:
第四步,这里我们来设置自定义控件的点击事件,比如点击左边图标后的监听处理,点击title文字后的处理等。这个在架构层规划好,确定有那些事件需要处理。我们定义一个接口,里面放三个点击处理的抽象方法,然后自定义控件的点击处理,直接调用实现类的方法。
public voidsetSDKTitlebarListener(ISDKTitleBar listener) {mISDKTitleBar= listener;}
外部调用时,实现ISDKTitleBar接口,然后传到我们的自定义控件中来。自定义内部处理如下
到这里为止,我们就完成了从外部调用处操作自定义控件内部的属性和监听。使用起来和android-sdk的控件没什么区别,如: