Android如何控制导航栏单个按键的显隐状态
来源:互联网 发布:阴阳师录屏软件 编辑:程序博客网 时间:2024/05/20 12:21
我们都知道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. }}
阅读全文
0 0
- Android如何控制导航栏单个按键的显隐状态
- 按键控制单个数码管显示
- Android 4.0 隐藏虚拟按键(导航栏)的方法
- Android 4.0 隐藏虚拟按键(导航栏)的方法 .
- Android 4.0 隐藏虚拟按键(导航栏)的方法
- Android 4.0 隐藏虚拟按键(导航栏)的方法
- Android 4.0 隐藏虚拟按键(导航栏)的方法
- Android 监听系统虚拟导航栏按键
- android 隐藏状态栏 导航栏 虚拟按键
- android 4.0 以上虚拟按键栏的控制
- 如何去除android对话框的导航栏
- android 按键速度控制
- 彩票案例-修改导航栏样式-单个Button的修改
- Android 禁止下拉状态栏和底部导航栏的控制
- Android 禁止下拉状态栏和底部导航栏的控制
- Android 设置应用的底部导航栏(虚拟按键)背景颜色
- Android 设置应用的底部导航栏(虚拟按键)背景颜色
- 动态加载导航树、重写button控制button的状态
- COM学习(四)——COM中的数据类型
- 基础算法练习
- c# 微软官方手册
- Python3实现简单爬虫
- 栈
- Android如何控制导航栏单个按键的显隐状态
- StringUtils工具类的常用方法
- BZOJ 1576: [Usaco2009 Jan]安全路经Travel【最短路树】【树链剖分】
- vim常用命令总结 (转)
- MVP之登录
- Java中的各种代码块的区别
- robot framework 中对于有滚动条的页面中元素的处理
- 数据结构之 栈的应用
- Selenium学习笔记(webdriver环境搭建)