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:56
  • 200128

Android L 判断是否有NavigationBar的方式

Android L中,如何得知是否有虚拟按键呢。查看了下PhoneWindowManager中的代码,这会在这整理处如下方法:    获取是否存在NavigationBar:  private s...
  • lgaojiantong
  • lgaojiantong
  • 2015-01-19 16:08:56
  • 2592

关于华为手机自定义view中NavigationBar显示与隐藏造成高度问题的解决办法

//获取是否存在NavigationBar public static boolean checkDeviceHasNavigationBar(Context context) { ...
  • zanjiaowei
  • zanjiaowei
  • 2017-08-05 11:02:29
  • 676

Andorid 判断手机是否有下方导航栏(NavigationBar)的几种方法

参考:https://zhidao.baidu.com/question/1241728811608853219.html 第一种:判断手机是否有物理按键,有就没有导航栏,反之就有(这个有点...
  • muzhengjun
  • muzhengjun
  • 2017-03-17 15:18:18
  • 2639

Android判断手机时候有导航栏的方法

参考:https://zhidao.baidu.com/question/1241728811608853219.html             https://segmentfault.com/q...
  • android_zhengyongbo
  • android_zhengyongbo
  • 2017-04-01 10:02:26
  • 2127

获取StatusBar,NavigationBar高度及判断是否存在

判断是否存在NavigationBar:private static boolean checkDeviceHasNavigationBar(Context context) { boolean...
  • a940659387
  • a940659387
  • 2016-01-25 14:59:13
  • 2983

系统去掉 Android 4.4.2 的StatusBar和NavigationBar

1. 简介     在Android4.4.2中,
  • MyArrow
  • MyArrow
  • 2014-05-13 14:29:17
  • 27401

Android ActionBar详解(二):ActionBar实现Tabs标签以及下拉导航

一.添加标签 Tabs   在ActionBar中实现标签页可以实现android.app.ActionBar.TabListener ,重写onTabSelected、onTabUnselect...
  • t12x3456
  • t12x3456
  • 2012-11-04 10:31:47
  • 23146

Android获取statusBar和navigationBar高度

int resIdStatusbarHeight = resources.getIdentifier("status_bar_height", "dimen", "android"); int st...
  • czyzy
  • czyzy
  • 2014-05-21 15:57:24
  • 2495

如何自定义NavigationBar的高度

在Xcode中状态栏占20个点,navigationBar占44个点,有时候隐藏掉状态栏后能会出现这样的情况,图片的大小已经超出了navigationBar的高度了,非常难看,默认情况下navigat...
  • sk359271158
  • sk359271158
  • 2015-11-03 20:17:56
  • 486
收藏助手
不良信息举报
您举报文章:Android 检查设备是否存在 导航栏 NavigationBar
举报原因:
原因补充:

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