我们都知道Android系统的导航栏通常有三个按键,分别是BACK, HOME, APP_SWITCH. 网上很多有关导航栏和状态栏显隐的文章,但几乎都是控制导航栏或状态栏所有按键同时显示或消失,如果我们想定制一种接口,它可以控制我们的导航栏三个按键中的某一个按键的显示或隐藏,我们该怎么做呢?

其实很简单,导航栏作为系统应用SystemUI的一部分,导航栏的那三个按键也有对应的布局,这样我们就可以直接通过布局id来控制对应按键的显隐状态,仔细阅读源码,我们能发现其实NavigationBarView给我们提供了现成的接口,只是这个接口并没有暴露出来给用户调用。接口名称如下,我们可以通过向接口中传递不同的参数来控制单个导航栏按键的使能状态。

NavigationBarView.setDisabledFlags(int disableStatus);

本人封装了一个方法来控制这些按键状态,具体实现如下:

/**

* @param keyId: keycode id(eg: KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_HOME, KeyEvent.KEYCODE_APP_SWITCH);

* @param enable: true: key enable; false: key disable.

*/

public void setKeyEnable(int keyId, boolean enable){

Intent intent = new Intent("android.intent.action.NAVGATIONBAR_CHANGED");

intent.putExtra("key_enabled", enable);

int enableStatus = enable? 1 : 0;

switch (keyId){

case KeyEvent.KEYCODE_BACK:

Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.BACK_ENABLE, enableStatus);

intent.putExtra("key_code", KeyEvent.KEYCODE_BACK);

break;

case KeyEvent.KEYCODE_HOME:

Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.HOME_ENABLE, enableStatus);

intent.putExtra("key_code", KeyEvent.KEYCODE_HOME);

break;

case KeyEvent.KEYCODE_APP_SWITCH:

Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.SWITCH_ENABLE, enableStatus);

intent.putExtra("key_code", KeyEvent.KEYCODE_APP_SWITCH);

break;

}

mContext.sendBroadcast(intent);

}

Settings.java (frameworks\base\core\java\android\provider)

public static final class Secure extends NameValueTable {

…...

static {

…...

// modified by hubangming to make navigationbar button invisible, patch begin.

MOVED_TO_GLOBAL.add(Settings.Global.BACK_ENABLE);

MOVED_TO_GLOBAL.add(Settings.Global.HOME_ENABLE);

MOVED_TO_GLOBAL.add(Settings.Global.SWITCH_ENABLE);

// modified by hubangming, patch end.

}

public static final class Global extends NameValueTable {

…...

// modified by haming to make navigationbar button invisible, patch begin.

/**

* Enable the back key visible or invisible on navigationbar

* @hide

*/

public static final String BACK_ENABLE = "navigationbar_back_enable";

/**

* Enable the home key visible or invisible on navigationbar

* @hide

*/

public static final String HOME_ENABLE = "navigationbar_home_enable";

/**

* Enable the app_switch key visible or invisible on navigationbar

* @hide

*/

public static final String SWITCH_ENABLE = "navigationbar_switch_enable";

// modified by haming, patch end.

…...

}

PhoneStatusBar.java (frameworks\base\packages\systemui\src\com\android\systemui\statusbar\phone)

public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

DragDownHelper.DragDownCallback, ActivityStarter, OnUnlockMethodChangedListener {

…...

// modified by haming to make navigationbar button invisible, patch begin.

int disableStatus = 0;

//modified by haming, patch end.

…...

protected PhoneStatusBarView makeStatusBarView() {

…...

// modified by haming to make navigationbar button invisible, patch begin.

IntentFilter nvFilter = new IntentFilter();

nvFilter.addAction("android.intent.action.NAVGATIONBAR_CHANGED");

context.registerReceiver(mNavVisibleReceiver, nvFilter);

//modified by haming, patch end.

…...

}

// modified by haming to make navigationbar button invisible, patch begin.

private void setNavigationBarEnable(){

if(Settings.Global.getInt(mContext.getContentResolver(), "navigationbar_back_enable", 1) == 0){

disableStatus |= View.STATUS_BAR_DISABLE_BACK;

} else if (Settings.Global.getInt(mContext.getContentResolver(), "navigationbar_back_enable", 1) == 1){

disableStatus &= ~View.STATUS_BAR_DISABLE_BACK;

}

if(Settings.Global.getInt(mContext.getContentResolver(), "navigationbar_home_enable", 1) == 0){

disableStatus |= View.STATUS_BAR_DISABLE_HOME;

} else if(Settings.Global.getInt(mContext.getContentResolver(), "navigationbar_home_enable", 1) == 1){

disableStatus &= ~View.STATUS_BAR_DISABLE_HOME;

}

if(Settings.Global.getInt(mContext.getContentResolver(), "navigationbar_switch_enable", 1) == 0){

disableStatus |= View.STATUS_BAR_DISABLE_RECENT;

} else if(Settings.Global.getInt(mContext.getContentResolver(), "navigationbar_switch_enable", 1) == 1){

disableStatus &= ~View.STATUS_BAR_DISABLE_RECENT;

}

mNavigationBarView.setDisabledFlags(disableStatus);

}

// modified by haming, patch end.

// modified by haming to make navigationbar button invisible, patch begin.

private BroadcastReceiver mNavVisibleReceiver = new BroadcastReceiver(){

public void onReceive(Context context, Intent intent) {

String action = intent.getAction();

if ("android.intent.action.NAVGATIONBAR_CHANGED".equals(action)) {

setNavigationBarEnable();

}

}

};

// modified by haming, patch end.

@Override

public void destroy() {

…...

// modified by haming to make navigationbar button invisible, patch begin.

mContext.unregisterReceiver(mNavVisibleReceiver);

// modified by haming, patch end.

}

}

Android隐藏导航栏按键,Android如何控制导航栏单个按键的显隐状态相关推荐

  1. vue 电梯导航制作(鼠标滚动控制导航栏的显示与隐藏)

    鼠标滚动控制导航栏的显示与隐藏 上图先看效果: 下面为2张图,默认为导航栏,当鼠标向下滚动一定距离时,变为箭头, 并且点击黄色的返回图标,也变为下方箭头,此时再滚动窗口,不会变为导航栏. 点击下方箭头 ...

  2. android隐藏软键盘方法,Android显示和隐藏软键盘方法

    InputMethodManager类 Android中软键盘的管理主要是通过InputMethodManager类来完成的. InputMethodManager对象的获取方法如下: 获取到Inpu ...

  3. android隐藏app应用程序,Android开发:怎样隐藏自己的app应用

    本文主要介绍怎样通过改动AndroidManifest.xml清单文件来达到隐藏自身应用的目的,不是隐藏第三方应用.为了不浪费大家时间.特此说明. 第一种 改动Activity标签下的节点下的cate ...

  4. android隐藏软键盘方法,Android使用InputMethodManager显示和隐藏软键盘

    Android主要用InputMethodManager来对软键盘进行管理.手动显示或隐藏软键盘前需要先获取InputMethodManager. InputMethodManager imm = ( ...

  5. 多功能检测按键 单按 长按 多个按键 响应方式

    //这是我对以前发表过的按键检测方式的优化,之前的是:http://blog.csdn.net/chuangwu2009/article/details/9466715 //现在的程序按键有效检测方式 ...

  6. Android 10.0 导航栏增加虚拟按键 点击控制下拉状态栏展开和收缩

    目录 1.概述 2.导航栏增加虚拟按键 点击控制下拉状态栏展开和收缩的核心代码

  7. android 7.0平台客制化虚拟导航按键(隐藏NavigationBar,上滑显示NavigationBar)

    如图,需求是增加一个按钮可以隐藏NavigationBar,上滑显示NavigationBar. 参考文章: Android 8.1平台客制化虚拟导航按键 Android 7.0 虚拟按键(Navig ...

  8. android判断多个按钮,Android开发之判断有无虚拟按键(导航栏)的实例

    判断有无虚拟按键(导航栏) 现在很大一部分手机没有虚拟按键,一部分有.我们在做适配的时候可能会用到这方面的知识. 例如:屏幕填充整个屏幕的时候,没办法只能连导航栏一起填充了,但是这个不是我们想要的,我 ...

  9. Android隐藏状态栏、导航栏

    Android隐藏状态栏.导航栏 [java] view plaincopy private void hideStatusNavigationBar(){ if(Build.VERSION.SDK_ ...

最新文章

  1. 如何添加QQ 微信等程序到右键打开
  2. Transformers2.0让你三行代码调用语言模型,兼容TF2.0和PyTorch
  3. 设置Django关闭Debug后的静态文件路由
  4. 『信息收集』GoogleHacking快速定位目标网站
  5. QPushButton 点击信号分析
  6. 常用计算机类型包括个人计算机,网络教育统考《计算机应用基础》多媒体技术模拟题(二)...
  7. 迅雷游戏盒子下载|迅雷游戏盒子下载
  8. python字符串转float_Python将string转换到float的实例方法
  9. CISCO交换机上实现MAC和端口、IP和端口、IP和MAC的绑定
  10. ACM PKU 1251 Jungle Roads http://poj.org/problem?id=1251
  11. 飞机大战小游戏3.0
  12. Python 3 从入门到精通 Mac OS
  13. unity3d AssetBundle 资源热更专题
  14. 字节测试开发面试题总结
  15. 有关CCF的CSP认证
  16. TokenInsight 对话首席——分片技术的现状与未来(下)
  17. java实现excel合并的单元格自动换行自动调高
  18. windows下python安装basemap,画世界地图以及根据经纬度标点
  19. python利用公式计算Π(pi)的值
  20. 陳三甲网络笔记:抖音赚钱记,我被割韭菜的经历!

热门文章

  1. 收藏 年度大盘点 可信计算相关(国家、部委、省市)法律、法规、政策、规划汇总
  2. Java 使用Docx4j实现word文档Docx格式转Doc格式
  3. C# 把时间转为秒_微信 1秒语音助手/附带安卓教程
  4. Node — Koa2
  5. Linux安装NFS
  6. 透过2W条评论看动漫《博人传-火影忍者新时代》
  7. 一加手机怎么root权限_一加 A3010手机怎样Root,如何获取Root权限?
  8. AJAX使用淘宝API查询手机归属地和运营商信息
  9. java.lang.ClassNotFoundException: org.springframework.web.servlet.HandlerMapping解决方法
  10. 英文短语缩写问题 1199 getline()使用