Android 检查设备是否存在 导航栏 NavigationBar

原创 2014年12月09日 11:12:36

尊重原创、尊重作者,转载请标明出处:

http://blog.csdn.net/lnb333666/article/details/41821149


目前也没有可靠的方法来检查设备上是否有导航栏。可以使用KeyCharacterMap.deviceHasKey来检查设备上是否有某些物理键,比如说菜单键、返回键、Home键。然后我们可以通过存在物理键与否来判断是否有NavigationBar(一般来说手机上物理键、NavigationBar共存).

public static int getNavigationBarHeight(Activity activity) {
		Resources resources = activity.getResources();
		int resourceId = resources.getIdentifier("navigation_bar_height",
				"dimen", "android");
		//获取NavigationBar的高度
		int height = resources.getDimensionPixelSize(resourceId);
		return height;
	}

上面这段代码,在绝大多数情况下都能获取到NavigationBar的高度。所以有人想通过这个高度来判断是否有NavigationBar 是不行的。当然4.0版本以下就不用说了。确认个问题,NavigationBar是4.0以上才有么?

因为设备有物理键仍然可以有一个导航栏。任何设备运行自定义rom时都会设置一个选项,是否禁用的物理键,并添加一个导航栏。看看API:

ViewConfiguration.get(Context context).hasPermanentMenuKey()  有这么一句描述 :Report if the device has a permanent menu key available to the user(报告如果设备有一个永久的菜单主要提供给用户).


android.view.KeyCharacterMap.deviceHasKey(int keyCode) 的描述:Queries the framework about whether any physical keys exist on the any keyboard attached to the device that are capable of producing the given key code(查询框架是否存在任何物理键盘的任何键盘连接到设备生产给出关键代码的能力。).


那么解决的办法就是:

@SuppressLint("NewApi") 
	public static boolean checkDeviceHasNavigationBar(Context activity) {

		//通过判断设备是否有返回键、菜单键(不是虚拟键,是手机屏幕外的按键)来确定是否有navigation bar
		boolean hasMenuKey = ViewConfiguration.get(activity)
				.hasPermanentMenuKey();
		boolean hasBackKey = KeyCharacterMap
				.deviceHasKey(KeyEvent.KEYCODE_BACK);

		if (!hasMenuKey && !hasBackKey) {
			// 做任何你需要做的,这个设备有一个导航栏
			return true;
		}
		return false;
	}

尊重原创、尊重作者,转载请标明出处:

http://blog.csdn.net/lnb333666/article/details/41821149

Android ActionBar完全解析,使用官方推荐的最佳导航栏(上)

Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,...
  • sinyu890807
  • sinyu890807
  • 2014年06月05日 08:56
  • 195895

android开发笔记之虚拟键(navigation bar)的一些状态的读取

最近有一个UI适配的问题,涉及到了虚拟键()
  • hfreeman2008
  • hfreeman2008
  • 2014年05月17日 17:52
  • 4119

华为手机中导航键显示与隐藏的监听

首先配置监听 Context.registerContentObserver(Settings.System.getUriFor("navigationbar_is_min"), true, mNa...
  • yulliam
  • yulliam
  • 2016年03月03日 11:08
  • 1959

如何控制android系统中NavigationBar 的显示与隐藏

我们使用的大多数android手机上的Home键,返回键以及menu键都是实体触摸感应按键。如果你用Google的Nexus4或Nexus5话,你会发现它们并没有实体按键或触摸感应按键,取而代之的是在...
  • a2758963
  • a2758963
  • 2015年01月21日 20:44
  • 5876

android导航栏隐藏与浮现

Android M已经发布了很久了,很多新的特性也非常的吸引人,比如Doze模式可以使导航时间更长,刷到nexus5上,体验了一下确实不错。但是导航栏(虚拟按键)一直存在,感觉不是特别的爽。今天我们就...
  • dliyuedong
  • dliyuedong
  • 2015年10月23日 14:17
  • 11622

Android 检查设备是否存在 导航栏 NavigationBar

目前也没有可靠的方法来检查设备上是否有导航栏。可以使用KeyCharacterMap.deviceHasKey来检查设备上是否有某些物理键,比如说菜单键、返回键、Home键。然后我们可以通过存在物理键...
  • yangxi_001
  • yangxi_001
  • 2016年03月17日 12:08
  • 699

BottomNavigationBar的使用

自从Google推出Metrial Design这种UI规范,Android在界面设计上已经不逊色于苹果了,今天博主为大家带来BottomNavigationBar这个控件的使用,网络上很多人说goo...
  • github_38613243
  • github_38613243
  • 2017年07月07日 11:47
  • 764

Android获取statusBar和navigationBar高度

int resIdStatusbarHeight = resources.getIdentifier("status_bar_height", "dimen", "android"); int st...
  • czyzy
  • czyzy
  • 2014年05月21日 15:57
  • 2379

Android如何判断NavigationBar是否显示(获取屏幕真实的高度)

转自:http://www.jianshu.com/p/84d951b3f079 简书-十个雨点 有些时候,我们需要知道当前手机上是否显示了NavigationBar,也就是屏幕底部的虚拟按键。 ...
  • liang_duo_yu
  • liang_duo_yu
  • 2017年05月09日 16:59
  • 904

Android之SystemUI加载流程和NavigationBar的分析

Android之SystemUI加载流程和NavigationBar的分析 本篇只分析SystemUI的加载过程和SystemUI的其中的一个模块StatusBar的小模块NavigationBa...
  • nzsdyun123
  • nzsdyun123
  • 2016年04月15日 16:14
  • 6747
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android 检查设备是否存在 导航栏 NavigationBar
举报原因:
原因补充:

(最多只允许输入30个字)