加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

修改ActionBar的HomeLayout部分

(2013-06-30 19:51:34)
标签:

android

actionbar

style

reflect

it

ActionBar的确提供了许多方便,不过要改起来也挺伤脑筋,不熟悉样式的肯定改不了(废话),熟悉的也会发现一些坑,这次不幸踩到一个。起因不说了,发现的问题是,当我用以下代码修改了ActionButton样式后,却发现返回按钮和标题栏的样式未发生变化。

以上代码的预期效果如图1所示,但是却同时发生了图2所示的情况,Home按钮并没有被改过来


直觉告诉我是要改home对应的样式,于是发现了这些东西
最后一行,指出了左侧Home的Layout,是引用了一个布局文件,找到那个文件后,我感觉到不能用这个东西,因为它引用的东西太多了,搞到项目里会引起资源文件灾难,必须另找出路。(其实另一方面是我足够懒,实在不想在源码里面再多翻什么了,谁知道如何直接在style里改的请告诉我http://www/uc/myshow/blog/misc/gif/E___6724EN00SIGG.gif

那么剩下的路只有分析源码了,把ActionBarImpl.java(不是ActionBar.java,ActionBarImpl才是真正的实现)拿出来读了一把,发现里面有两个关键类,一个是ActionBarView,另一个是ActionBarView$HomeView,它们决定了ActionBar如何呈现。


http://s6/mw690/68b67143ge05e206f4a55&690(图5)

图4和图5中高亮的部分即是找到的代码中关键部分,其逻辑关系很简单,通过Activity内的ActionBar,找到ActionBarImpl,然后再找到 mActionView,再找到 mHomeLayout和mTitleLayout(它们一个决定Home行为,一个决定标题,两个都要改)。

代码很简单的就出来了,用反射!

这样就能到达我所预期的效果了,左侧的返回按钮显示正常。
需要说明的是,由于隐藏的东西一定有隐藏的道理,说不定什么时候就更换了,还是需要经常的关注源码和新版本,以免哪天突然反射的部分无法使用了,搞得手忙脚乱,目前的代码在4.0~4.2上均可用,但是不保证以后也可用。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有