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()(原有):
- private void addNavigationBar() {
- if (DEBUG) Slog.v(TAG, "addNavigationBar: about to add " + mNavigationBarView);
- if (mNavigationBarView == null) return;
- prepareNavigationBarView();
- mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
- }
<2>隐藏方法定义如下(新加):
- private void removeNavigationBar() {
- if (mNavigationBarView == null) return;
- mWindowManager.removeView(mNavigationBarView);
- sp;}
<3>广播的注册
- IntentFilter filter1 = new IntentFilter();
- filter1.addAction("MyRecv_action");
- context.registerReceiver(mBroadcastReceiver1, filter1);
<4>广播监听及处理
- private BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (isOrderedBroadcast()) {
- if (action.equals("MyRecv_Action")) {
- String cmd = intent.getStringExtra("cmd");
- //布尔标志isDisplayNavBar保存当前导航栏的状态
- if(cmd.equals("hide")&&isDisplayNavBar){
- isDisplayNavBar=false;
- removeNavigationBar();
- }else if(cmd.equals("show")&&!isDisplayNavBar){
- addNavigationBar();
- isDisplayNavBar=true;
- }
- }
- this.abortBroadcast();
- }
- }
- ;
至此修改完毕,编译完毕之后产生新的SystemUi.apk ,替换原文件系统的SystemUi.apk 后重启即可。
在我们的app里面,如果想要隐藏导航栏:
- Intent intent=new Intent();
- intent.setAction("MyRecv_action");
- intent.putExtra("cmd","hide");
- this.sendOrderedBroadcast(intent,null);
如果想要显示导航栏:
- Intent intent=new Intent();
- intent.setAction("MyRecv_action");
- intent.putExtra("cmd","show");
- this.sendOrderedBroadcast(intent,null);
Android4.2.2 动态显示隐藏屏幕底部的导航栏(对系统源码进行修改)的更多相关文章
- Android隐藏状态栏、导航栏
Android隐藏状态栏.导航栏 private void hideStatusNavigationBar(){ if(Build.VERSION.SDK_INT<16){ this.getWi ...
- 移动端webapp如何隐藏浏览器的导航栏
webapp如何隐藏浏览器的导航栏 在webapp开发中,手机浏览器的导航栏会让我们的页面看起来很怪异,这个时候我们就需要将导航栏给隐藏起来,隐藏的方法十分简单,只需要在head头中加入以下几行代码就 ...
- vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改
vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改.vue <div class="commonHeader" v-bind:class=" ...
- Android App 隐藏标题栏+状态栏+导航栏
1. 隐藏当前Activity标题栏 在当前Activity中调用:this.requestWindowFeature(Window.FEATURE_NO_TITLE); 2. 隐藏当前Activit ...
- iOS 7.1的Safari为meta标签新增minimal-ui属性,在网页加载时隐藏地址栏与导航栏
在 iOS 7.1 的 Safari 中为 meta 标签新增 minimal-ui 属性,让网页在加载时便可隐藏顶部的地址栏与底部的导航栏. 如何实现?你只需将“minimal-ui”加入 view ...
- Android4.4系统源码百度网盘下载
众所周知.Android如今非常火,肯定也有非常多android开发人员像我一样想研究android系统的源码.可是假设依照Google官方站点http://source.android.com/so ...
- 多个精美的导航样式web2.0源码
效果体验:http://keleyi.com/keleyi/phtml/divcss/6.htm 兼容多浏览器,例如IE,Chrome,火狐 等. 完整代码,保存到htm文件打开也可以查看效果: &l ...
- Ros学习——移动机器人Ros导航详解及源码解析
1 执行过程 1.运行仿真机器人fake_turtlebot.launch:加载机器人模型——启动机器人仿真器——发布机器人状态 2.运行amcl节点fake_amcl.launch:加载地图节点ma ...
- iOS开发中的错误整理,导航控制器的导航栏取消系统渲染的错误
随机推荐
- 【dp】守望者的逃离
妙 题目描述 恶魔猎手尤迪安野心勃勃,他背着了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快 ...
- LVS-nat模式-原理介绍
集群,为解决某个特定问题将多台计算机组合起来形成的单个系统 lvs-nat: 本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发 lvs集群类 ...
- POJ:1751-Highways(Kruskal和Prim)
Highways Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6078 Accepted: 1650 Special Judg ...
- Android自动化测试如何获取坐标点?
有以下三种方法: 1.打开开发者选项中的“显示指针位置”: 英文文版本为Settings->Developer option->Show touches(on)->Pointer l ...
- WPF触控程序的开发(一)——有用的资源
迟来的一篇博文,每次都要撞到月末,这个月实在太忙了,除了在公司上班,还接了个单子,用wpf做一个触屏软件,类似iphone的相册功能.先说搭建开发环境吧,我是不可能去买个平板来的,再说基于win7的程 ...
- 各浏览器对 window.open() 的支持
原文地址
- 反转单词顺序 VS 左旋转字符串
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标垫符号和普通字母一样处理.例如输入字符串“I am a student.”,则输出“student. a am I ...
- day19-IO多路复用
1.I/O多路复用指:通过一种机制,可监听多个描述符(soket对象)(文件句柄),一旦某个描述符发送编号(一般指读就绪或写就绪),能够通知程序进行相应的读写操作. 2.I/O多路复用方式:selec ...
- luogu3390 【模板】矩阵快速幂
#include <iostream> #include <cstdio> using namespace std; typedef long long ll; ll k; c ...
- Leetcode 456.132模式
132模式 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj.设计 ...