修改ActionBar的HomeLayout部分

2013-06-30 19:51阅读:
ActionBar的确提供了许多方便,不过要改起来也挺伤脑筋,不熟悉样式的肯定改不了(废话),熟悉的也会发现一些坑,这次不幸踩到一个。起因不说了,发现的问题是,当我用以下代码修改了ActionButton样式后,却发现返回按钮和标题栏的样式未发生变化。
修改ActionBar的HomeLayout部分
以上代码的预期效果如图1所示,但是却同时发生了图2所示的情况,Home按钮并没有被改过来
修改ActionBar的HomeLayout部分(图1)
修改ActionBar的HomeLayout部分
(图2)
直觉告诉我是要改home对应的样式,于是发现了这些东西
修改ActionBar的HomeLayout部分(图3)
最后一行,指出了左侧Home的Layout,是引用了一个布局文件,找到那个文件后,我感觉到不能用这个东西,因为它引用的东西太多了,搞到项目里会引起资源文件灾难,必须另找出路。(其实另一方面是我足够懒,实在不想在源码里面再多翻什么了,谁知道如何直接在style里改的请告诉我 修改ActionBar的HomeLayout部分
那么剩下的路只有分析源码了,把ActionBarImpl.java(不是ActionBar.java,ActionBarImpl才是真正的实现)拿出来读了一把,发现里面有两个关键类,一个是ActionBarView,另一个是ActionBarView$HomeView,它们决定了ActionBar如何呈现。
修改ActionBar的HomeLayout部分(图4)
修改ActionBar的HomeLayout部分(图5)
图4和图5中高亮的部分即是找到的代码中关键部分,其逻辑关系很简单,通过Activity内的ActionBar,找到ActionBarImpl,然后再找到 mActionView,再找到 mHomeLayout和mTitleLayout(它们一个决定Home行为,一个决定标题,两个都要改)。
代码很简单的就出来了,用反射!
修改ActionBar的HomeLayout部分(图6)
这样就能到达我所预期的效果了,左侧的返回按钮显示正常。
修改ActionBar的HomeLayout部分
需要说明的是,由于隐藏的东西一定有隐藏的道理,说不定什么时候就更换了,还是需要经常的关注源码和新版本,以免哪天突然反射的部分无法使用了,搞得手忙脚乱,目前的代码在4.0~4.2上均可用,但是不保证以后也可用。