实战脱坑,定制Android导航栏的那些坑

新的项目下来了,由于android出了不少新版本,加上本人也确实不满足复制粘贴,决定在新的项目中,实现导航栏的统一管理定制,首先先去查了些资料,听说出了个actionbar的替代品ToolBar,继续Toolbar的探坑之路。经过了大半天的探索,首先我真想先图草下google的工程师门,这ToolBar和actionBar到底哪里不一样了,起码目前我感觉这个ToolBar的可操控性和实用性真是两个字,鸡肋。玩了会demo,果断撤退,发现满足不了我的需求啊,回头继续用actionbar算了,大半天过去,反复在纠结这个actionBar如何让他的logo也设置点击事件,网上搜了很久,依然没找到答案,但是期间也有惊喜,意外的发现android的v7包下的actionBar在显示logo这个设置上有个小bug,算了,毕竟也是要淘汰的产品,上代码了:

 V7包设置logo的sample
getActionBar().setDisplayShowHomeEnabled(true);
getActionBar().setLogo();
getActionBar().setDisplayUseLogoEnabled(true);

 既然都满足不了需求,那么只有让我自己来造这个轮子了,我们首先明确下目标,统一导航管理。首先我们来说顶部导航,顶部导航需求:左侧按钮,中间标题,右边按钮。平平常常的布局,可是我实在时不甘心当一个小菜鸟太久,每天爬起来就是每个activity下写布局,然后再写同样的逻辑,这样不友好,bad。既然是统一管理,就创建一个公共的导航来管理公共的逻辑,其他的需要细分的交给相关类处理。好像形容的不恰当,就是写一个总的管理器,管理通用的导航功能,然后当哪个界面有特殊需求时,覆写方法,自己处理就好,简单省事,好维护。说着说着坑来了,首先我们统一,那么就得在每个窗口下创建导航,我们之前说过,这样不好,那么就没有好办法了吗?当然不是,用windowmanager这个神器,哈哈,我们就可以在每个布局加载之前动态的为他们各自加上导航了。在这之间,遇到一个问题关于windowmanagerParam的小细节,起初是想以实现漂浮窗口来实现这个功能的,可是当把params的type设置成phone_alert时,windowView添加的控件为ViewGroup时,程序的返回键竟然失效,无法退出程序,不知道着算不算google的bug。因此千万不要设置windowparam的type这一项。导航栏创建完成后,运行时发现它遮挡住了activity的上半部分,起初的想法时给每个acticvity手动加上padding来避免这个问题,那么就太对不起统一两个字了,在这里我用了个小技巧,我们应该知道,每个activity显示部分的根节点实际上就是一个FramLayout,我们创建布局的时候就是在这个根节点下在继续添加子节点来生成新的布局,既然这样我们找到这个FramLayout然后给它添加上padding就搞定了,继续上代码:

 root = (FrameLayout) getWindow().getDecorView().findViewById(android.R.id.content);
        int padding = (int) getResources().getDimension(bar_default_height);
        if (topIsShow() && bottomIsShow()) {
            root.setPadding(0, padding, 0, padding);
        } else if (topIsShow()) {
            root.setPadding(0, padding, 0, 0);
        } else {
            root.setPadding(0, 0, 0, padding);
        }

那么,统一管理的问题实现了,底部导航同理,但是底部导航是tab,就是点击切换fragment那种,这里又出现了个小问题,就是当我们退出在进来应用的时候,无法恢复上次退出时的那个选项,我用的SharePrefence记录的选中项,实在是想不到比较好的办法了,需求有点变态啊,退出了回来还要这么搞真是。总的来说,这次大部分时间花在了设计如何更统一的编码问题上,还是花了比较久的时间,不是很满意,下次加油,代码有待于优化。晚安!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值