众所周知,安卓系统中存在着虚拟导航栏,它们不是实体按键,而是通过软件实现的。一般而言,虚拟导航栏是长成下面这样的:

系统中默认的虚拟导航栏的背景色是黑色,按键的颜色是白色。但是如果软件需要自定义主题色的话,很多时候,我们都希望它的背景色能跟主题色保持一样。那我们怎么实现呢?

<item name="android:navigationBarColor">@color/colorPrimary</item>

在styles文件中的Theme中指定上面的属性就可以改变导航栏的背景色了。

其实在谷歌推出Android5.0的时候,官方文档中有下面的这张图片:

虚拟导航栏的背景色的属性是navigationBarColor,所以要想改变导航栏的颜色就要改变它的属性值,而且我们从图片中还可以得到另外一个信息:软件的主题色与导航栏的颜色是没有关联的。所以如果要想实现虚拟导航栏的背景色跟随App的主题色改变就需要我们在代码中手动设置。

/*** Set the navigation bar's color.** @param window The window.* @param color  The navigation bar's color.*/@RequiresApi(Build.VERSION_CODES.LOLLIPOP)public static void setNavBarColor(@NonNull final Window window, @ColorInt final int color) {window.setNavigationBarColor(color);}

需要注意的是:该方法是在Android5.0中才加入的,而且在设置之前还需要判断手机是否支持虚拟导航栏。

/*** Return whether the navigation bar visible.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isSupportNavBar() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {WindowManager wm = (WindowManager) BaseApplication.getsApplication().getSystemService(Context.WINDOW_SERVICE);if (wm == null) return false;Display display = wm.getDefaultDisplay();Point size = new Point();Point realSize = new Point();display.getSize(size);display.getRealSize(realSize);return realSize.y != size.y || realSize.x != size.x;}boolean menu = ViewConfiguration.get(BaseApplication.getsApplication()).hasPermanentMenuKey();boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);return !menu && !back;}

现在我们能够自由地控制导航栏的背景色了,但是有的时候我们可能还需要改变虚拟导航栏图标的颜色。
如果我们把背景色设置成白色,那么会是什么效果呢?

我原以为系统如果识别中背景色是白色会自动把三大金刚按键图标的颜色改成深色,很显然是我想多了。那有什么方法可以解决这种问题吗?
在谷歌Material Design设计文档中有这样一张图片:

图片上显示,虚拟导航栏有两种模式:Dark和Light。如果背景色是黑色,那按键的颜色就是白色的;如果背景色是白色,那按键的颜色就是深色。按照这个说法,想必肯定是提供了相关的API。
如果要想改变导航栏按键的颜色,需要设置属性:windowLightNavigationBar为true,也可以在代码中调用方法:

View.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);

这样设置以后导航栏按键的颜色就变成深色了。需要注意的是,该API是在27中才加入的。

总结一下:

  1. 设置导航栏背景色:设置navigationBarColor属性即可;
  2. 改变导航栏按键颜色为深色:设置标志位View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR,或者属性中设置windowLightNavigationBar为true;

改变虚拟导航栏(navigation bar)背景色及图标颜色相关推荐

  1. 微信小程序自定义导航栏 navigation bar 返回键 首页

    微信小程序自定义导航栏(wx_custom_navigation_bar) 自定义返回键.首页键,动态设置标题,响应式组件 版本号:2.0.0 作者:chen-yt github: https://g ...

  2. android功能导航布局,Android全面屏虚拟导航栏适配

    手机正朝着全面屏的方向演进,与此同时也给开发者带来了很多适配上的新问题,虚拟导航栏就是其中一个.最近在糗百的项目中,就有相关的适配问题,我查阅了目前关于虚拟导航栏适配的相关文章,基本上在全面屏手机里都 ...

  3. Android隐藏底部虚拟导航栏及系统状态栏终极方案

    前言: 笔者最近做一个平板的项目需要彻底隐藏系统状态栏及底部虚拟导航栏从而达到全屏的效果,试了很多方案都不太好,有些虽然能达到类似效果,但会因为其他因素例如弹框,手上滑而失去效果.在大部分项目是够用的 ...

  4. 安卓开发——如何完美隐藏底部虚拟导航栏

    对于如何隐藏底部虚拟按键,google官方给的解决办法: View decorView = getWindow().getDecorView(); // Hide both the navigatio ...

  5. android 窗口导航,Android全面屏虚拟导航栏适配

    手机正朝着全面屏的方向演进,与此同时也给开发者带来了很多适配上的新问题,虚拟导航栏就是其中一个.最近在糗百的项目中,就有相关的适配问题,我查阅了目前关于虚拟导航栏适配的相关文章,基本上在全面屏手机里都 ...

  6. 华为底部虚拟导航栏挡住布局

    问题:在实现ViewPager+Fragment+侧滑栏的界面时,华为搭载Android5.0以上操作系统的手机出现底部虚拟导航栏挡住布局.如下图所示: 问题解决后: 尝试 在实现这个功能的时候,我发 ...

  7. Android 全面屏适配及判断是否为全面屏,全面屏手势和虚拟导航栏的判断

    一,全面屏的适配 全面屏出现后,如果不做适配,屏幕上会出现上下黑边,影响视觉效果. 针对此问题,Android官方提供了适配方案,即提高App所支持的最大屏幕纵横比,实现起来也比较简单,在Androi ...

  8. Android进阶之路 - 顶部状态栏、底部虚拟导航栏相关操作

    快过年了,2018希望我们每个人都健康,开心,同时继续上进 ! 2020补充:基本包含了我几年在开发中用到的关于顶部状态栏和底部导航栏的绝大部分功能 ~ 顶部状态栏 状态栏是否可见 获取状态栏高度 隐 ...

  9. Android 华为虚拟导航栏适配

    Android 华为虚拟导航栏适配 在写界面的时候 然后发现在界面最底下的几行文字 正好被虚拟导航栏遮挡住了,不滑动还看不到底下的文字,所以想隐去这些导航栏. 采用下面的代码将DecorView中的属 ...

最新文章

  1. Leetcode Excel Sheet Column Number
  2. mysql访问oracle数据_python访问Oracle及Mysql数据库
  3. 自学python需要买书吗-学习Python的正确姿势—基础教学,教科书该怎么买?
  4. Avaddon勒索解密工具原理解析
  5. hive能替代oracle_173-Hive
  6. 经验风险、期望风险、结构风险
  7. Java Swing Mysql实现的员工工资管理系统项目源码附带视频指导运行教程
  8. VC中使用GetModuleFileName获取应用程序路径
  9. APP自动化测试系列之Appium介绍及运行原理
  10. 不限流量的物联卡是否真存在
  11. 缺少 mysql 扩展_解决phpmyadmin中缺少mysqli扩展问题的方法
  12. java 抽象属性 设计_设计模式之抽象文档模式
  13. word文档解密方法
  14. 计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年4月份最新版)
  15. amd r7 2700u linux,锐龙r72700u相当于 r72700u相当于什么水平?
  16. Python PDF文件合并,提取
  17. linux7中man inittab,RHCE考试Troubleshooting
  18. AGS量化自动炒币机器人与同类软件对比
  19. Do You Kown Asp.Net Core - 根据实体类自动创建Razor Page CURD页面模板
  20. dij最短路+堆优化

热门文章

  1. HTML核心(1)- 第一个网页
  2. angr原理与实践(三)——Arbiter:一种弥合二进制程序漏洞发现中的静态和动态鸿沟
  3. 如何在 Chrome 中执行 JavaScript 代码
  4. 《线性代数:行列式》: n 阶方阵行列式公式
  5. 计算机网络三大必备书,网络十大神书据说都看过的可以成仙
  6. (ICRA 2020) Instance Segmentation of LiDAR Point Clouds
  7. 【Android】自定义控件-颜色选择器/取色器
  8. sublime 3 build 3126 code ,压缩包在我的360企业云盘里,搜sublime
  9. SitePoint播客#34:对斜线表示抱歉
  10. 费马大定理:一部跨越时代的惊险小说