封装项目通用Toolbar与项目协作

仅做个人记录


封装一个大型项目的Toolbar


项目原来的Toolbar的不足之处

1.Title默认无法居中

2.左边只能是Icon,不支持文字

3.右边不能显示图片、文字

这3点是通过设置自定义View来实现的,除此以外,还有原生样式不可变,子类代码、逻辑冗余等缺点


但是Toolbar又无法割舍,其丰富的API和UI互动特效在现在和未来都是有需求的

直接在Toolbar里嵌套其他布局,也不行,因为其原生的Icon、Title样式在该项目上有很好的表现


第一步,阅读两个中间页WithActionBarActivity、WithNoActionBarActivity

第二步,阅读继承自这2个中间页的所有子活动

通过这两步,以及项目在手机上运行的实际效果,成功地收集了所有的样式


最终总结出

封装项目通用Toolbar与项目协作_第1张图片

左边的back键:原生箭头、叉号,文字

中间的title:靠左、居中

右边:图、文,需要2套

由于项目TextView很特殊,可以单独显示图片,所以支持在ImageButton、TextView外,还支持View的直接放置


封装的过程中碰到许多问题,走了许多弯路

1.强行使用该项目自定义TextView,被自定义View以及其他工具类之间的依赖所击败,后来又直接在该项目上工作,但是手机问题、项目太大,导致效率低下

2.Toolbar布局规则奇怪,一开始采取修改LayoutParams的形式,发现不能兼顾各种情况,最后直接重写layout

3.功能分层不明晰,因为既需要原生样式,又需要重新layout;不仅如此,原生样式为了居中title,也重写了layout,可以说是原生样式糅杂了自定义样式


最后封装了3层


第一层,原生样式扩展层

NavigationIcon的样式是我们需要的,setHome...可以默认设置NavigationIcon为箭头,setNavigationIcon可以传任意的Drawable,提供了辅助方法,采用ColorFilter修改Drawable颜色

Title可居中,可修改颜色,大小与字号就不修改了,已经符合该项目需求了,事实上做开发无须太纠结原生Title的样式,除非你的样式可以给用户更好的体验

可以setCustomView

这一层封装下来,已经可以满足原项目的需求了,不用专门为了Title居中而专门自定义View了,setCustomView也不需要设置enable了


第二层,非原生样式支持层

第一层支持了方便的Title居中,但是碰到左边文字的需要,右边的需要,就不行了。这也是我们力所能及也理所应当的封装。这一层主要通过重写layout的方式

当然了,默认View都是竖直居中的,所以我们只需要知道水平方向上的margin就可以轻松布局了

此外需要注意layout后,对于原生API比如setCustomView的影响,以及Title在遇到宽度为LayoutParams.MATCH_PARENT的情形的时候会自动隐藏等

我们通过原生扩展层+非原生支持层,就组合出了Toolbar 所需的所有功能,这样做在架构上无疑是最清晰的


第三层,主题支持层

上两层是所有项目通用层,这一层专门为该项目封装。每个项目都有不同的主题样式,我们需要把该项目常用的主题样式及常用的api封装进去,使得调用者只需要在设置了基本主题后,只需要修改1-2行代码,就可以完成这个页面Toolbar设置的所有任务了


主题支持+封装,使得我们每个页面,原来可能需要30行代码,现在2行就可完成任务


开发者调用舒畅度:链式调用+好的名字

一开始我把api都放在一个方法里,显然我在写demo测试的时候,发现了不足之处,不查阅我写的源码根本寸步难行,结果用了 链式调用,逻辑瞬间清晰

setLeftIcon() setRightText(),位置是第一层索引,控件类型是第二层索引


完成以后

配置GitLab SSH,在SourceTree上拉项目到本地,由SourceTree管理分支,在开发分支上创建子分支,拷贝封装后的类到项目基类中,在GitLab创建子分支,在Android Studio commit and push(Android Studio里也要注意当前在哪个分支上开发),合并子分支

你可能感兴趣的:(Android)