立即注册 登录
一牛网 返回首页

未济的个人空间 http://bbs.16rd.com/?6514 [收藏] [复制] [RSS]

日志

android4.2 动态显示/隐藏导航栏

已有 10505 次阅读2013-11-15 14:32 |个人分类:Android

 原生android4.2 的导航栏是状态栏应用【SystemUI】的一部分,其显示/隐藏是通过配置选项【config_showNavigationBar

PhoneWindowManager初始化时固定配置好的。一旦系统启动后,确认加载导航栏,运行中所有应用的layout布局都会有所影响,

除非是同时具有SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION表示的窗口,比如全屏视频播放时。

一般的窗口在layout时系统会预留出导航栏的区域,

使用户点击此区域的虚拟按键时导航栏可以接收按键事件并inject一个键值给当前应用处理,

这样当前应用就可以接收和处理back,menu等事件

由于公司需求要实现在无需重启的情况下,动态显示/隐藏导航栏。有看过这部分代码,并整理大概的实现方式如下。

主要的部分是导航栏的修改,

对应源文件:框架下SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.Java

SIMSun; font-size: 10px;">方法很简单,初始化时不做判断,直接加载导航栏,替换原来的方式:

private void initNavigationBar() {
   mNavigationBarView =
            (NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);
        mNavigationBarView.setDisabledFlags(mDisabled);
        mNavigationBarView.setBar(this);
}

在实现一个隐藏导航栏的接口,比如:

private void removeNavigationBar() {
      if (mNavigationBarView == null) return; 
 mWindowManager.removeView(mNavigationBarView);
}

另外,加一个导航栏显隐的标识 privatestaticboolean mIsDisplayNavigation=false;

记录当前导航栏状态,并在statusbar的刷新操作中对其进行判断,

以免在导航栏隐藏时还进行mNavigationBarView的setLowProfile或setSlippery等操作,造成SystemUI程序的异常。

至于动态的隐藏或显示的控制方式,方法很多。可以通过发送广播给SystemUI,由其他程序异步的控制。


路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

联系我们|小黑屋