Android4.2.2 动态显示隐藏屏幕底部的导航栏(对系统源码进行修改)

需求如题。

在Android4.2.2中,导航栏(也就是屏幕底部的三个按钮,home,back,recentapp)是系统应用SystemUi.apk的一部分,简言之,我们的需求就是让我们的app来控制SystemUi.apk,达到动态显示隐藏屏幕底部导航栏的效果。我们可以在SystemUi.apk的源码中留下接口便于我们控制导航栏的显示和隐藏,我们可以通过广播的接收与发送的方式来实现这个接口。

app------->发送广播(hide/show)

SystemUi.apk   ------>监听广播 (hide-隐藏导航栏,show-显示导航栏)

SystemUi.apk是系统应用,它在Android文件系统中的路径是:/system/app/;它在android源码中的路径是:frameworks/base/packages/SystemUI/;

我们只需修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.Java

<1>显示方法使用addNavigationBar()(原有):

[java] view plain copy

  1. private void addNavigationBar() {
  2. if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
  3. if (mNavigationBarView == null) return;
  4. prepareNavigationBarView();
  5. mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
  6. }

<2>隐藏方法定义如下(新加):

[java] view plain copy

  1. private void removeNavigationBar() {
  2. if (mNavigationBarView == null) return;
  3. mWindowManager.removeView(mNavigationBarView);
  4. sp;}

<3>广播的注册

[java] view plain copy

  1. IntentFilter filter1 = new IntentFilter();
  2. filter1.addAction("MyRecv_action");
  3. context.registerReceiver(mBroadcastReceiver1, filter1);

<4>广播监听及处理

[java] view plain copy

  1. private BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. String action = intent.getAction();
  5. if (isOrderedBroadcast()) {
  6. if (action.equals("MyRecv_Action")) {
  7. String cmd = intent.getStringExtra("cmd");
  8. //布尔标志isDisplayNavBar保存当前导航栏的状态
  9. if(cmd.equals("hide")&&isDisplayNavBar){
  10. isDisplayNavBar=false;
  11. removeNavigationBar();
  12. }else if(cmd.equals("show")&&!isDisplayNavBar){
  13. addNavigationBar();
  14. isDisplayNavBar=true;
  15. }
  16. }
  17. this.abortBroadcast();
  18. }
  19. }
  20. ;

至此修改完毕,编译完毕之后产生新的SystemUi.apk ,替换原文件系统的SystemUi.apk 后重启即可。

在我们的app里面,如果想要隐藏导航栏:

[java] view plain copy

  1. Intent intent=new Intent();
  2. intent.setAction("MyRecv_action");
  3. intent.putExtra("cmd","hide");
  4. this.sendOrderedBroadcast(intent,null);

如果想要显示导航栏:

[java] view plain copy

  1. Intent intent=new Intent();
  2. intent.setAction("MyRecv_action");
  3. intent.putExtra("cmd","show");
  4. this.sendOrderedBroadcast(intent,null);
时间: 2024-10-11 13:43:41

Android4.2.2 动态显示隐藏屏幕底部的导航栏(对系统源码进行修改)的相关文章

iOS 7.1的Safari为meta标签新增minimal-ui属性,在网页加载时隐藏地址栏与导航栏

iOS 7.1的Safari为meta标签新增minimal-ui属性,在网页加载时隐藏地址栏与导航栏 在过去,用 Safari 打开一个网页后是这样的: 是不是十分不爽?因为顶部的地址栏与底部的导航栏让页面显得非常拥挤,所以用户常常会马上伸手触屏滑动让它们隐藏起来. 始终强调人性化设计的苹果当然注意到了这点,于是在 iOS 7.1 的 Safari 中为 meta 标签新增 minimal-ui 属性,让网页在加载时便可隐藏顶部的地址栏与底部的导航栏. 如何实现?你只需将“minimal-ui

Android隐藏状态栏、导航栏

Android隐藏状态栏.导航栏 [java] view plain copy private void hideStatusNavigationBar(){ if(Build.VERSION.SDK_INT<16){ this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); }else{ int uiFlags = View

Android4.4系统源码百度网盘下载

众所周知.Android如今非常火,肯定也有非常多android开发人员像我一样想研究android系统的源码.可是假设依照Google官方站点http://source.android.com/source/downloading.html上面说的步骤下载.因为在国内连接谷歌的server网速实在太慢,可是android系统的源码非常大.超过8G.我在网上看到有哥们说他下了一个多月才下载完.更让人难以接受的是,下载过程中网络连接差点儿一定会多次中断.而假设连接超时,就会报错.我在下载过程中就报

Android 动态隐藏显示导航栏,状态栏

Talk is cheap, show me the code. --Linus Torvalds Okay, here: 一.导航栏: [java] view plain copy private void hideNavigationBar() { View decorView = getWindow().getDecorView(); int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULL

IOS7的状态栏和导航栏

iOS 7中默认的导航栏 在开始定制之前,我们先来看看iOS 7中默认导航栏的外观.通过Xcode用Single View Controller模板创建一个工程.然后将view controller嵌入到一个navigation controller中.如果你不想从头开始,那么也可以在这里下载到这个示例工程. Xcode 5包含有iOS 6和iOS 7模拟器,我们可以在这两个不同的模拟器版本中运行示例程序,进行对比,如下图所示: vcC4tcSxs76w0dXJqzwvaDM+CjxwPtTaa

ios 实现自定义状态栏StatusBar 和 导航栏navigationBar 的状态和颜色

很多app中可以看到不同与导航栏的状态栏的颜色,他妈的真绕嘴. 一.更改状态栏颜色 (StatusBar) 就是比如导航栏是红色的状态栏是绿色的. 要实现这样的效果其实很简单,就是添加一个背景view. 简单的实现过程如下: 1 // 设置导航颜色 可用 2 [self.navigationController.navigationBar setBarTintColor:[UIColor redColor]]; 3 //创建一个高20的假状态栏 4 UIView *statusBarView =

状态栏、导航栏、导航控制器相关属性设置等注意事项

2015年07月08日 1.对于 IOS6 导航栏背景图片为 44 则@2x 得设计为 88 2.对于 IOS7 导航栏背景图片为 64 则@2x 得设计为 128 出现以上差异原因是由于IOS6里面,状态栏20是不包括在导航栏里面的,而 IOS7是包含在导航栏里面的. 3. 修改状态栏的文字颜色(全局修改) 1. 首先先在 info.plist文件中,先添加一个View controller-based status bar appearance   的选项 并设置为 NO. 2.这是可以使用

iOS 7 教程:定制iOS 7中的导航栏和状态栏

目录(?)[-] iOS 7中默认的导航栏 设置导航栏的背景颜色 在导航栏中使用背景图片 定制返回按钮的颜 修改导航栏标题的字体 修改导航栏标题为图片 添加多个按钮 修改状态栏的风格 隐藏状态栏 总结 注:本文译自Customizing Navigation Bar and Status Bar in iOS 7 近期,跟大多数开发者一样,我也正忙于对程序进行升级以适配iOS 7.最新的iOS 7外观上有大量的改动.从开发者的角度来看,导航栏和状态栏就发生了明显的变化.状态栏现在是半透明的了,这

iOS 7中的导航栏和状态栏

iOS 7中默认的导航栏 在开始定制之前,我们先来看看iOS 7中默认导航栏的外观.通过Xcode用Single View Controller模板创建一个工程.然后将view controller嵌入到一个navigation controller中.如果你不想从头开始,那么也可以在这里下载到这个 示例工程.Xcode 5包含有iOS 6和iOS 7模拟器,我们可以在这两个不同的模拟器版本中运行示例程序,进行对比,如下图所示: 如上图所示,在iOS 7中的导航栏默认情况下跟状态栏是交织在一起的