我正在编写一个带透明导航栏的Android应用。要相应地调整布局,我需要知道设备是否有软件或硬件按钮。
在我的研究期间,我遇到了以下解决方案:
boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
这种方法不适用于三星Note 4或HTC One等新设备,它们没有菜单键,但仍有硬件按钮。
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);
boolean hasHardwareButtons = hasBackKey && hasHomeKey;
这也行不通,因为索尼Xperia Z3 Compact等设备虽然有软件导航栏,但仍然可以正常使用。
有没有可靠的方法来确定是否有物理按钮或软件导航栏?
答案 0 :(得分:8)
见this answer。您可以获得显示的实际高度(以像素为单位),然后获取应用程序可用的高度,并确定设备是否具有带有这些值的屏幕导航栏。
答案 1 :(得分:6)
here发布的答案解决了这个问题。为了完整起见,这是我现在使用的代码:
private static boolean hasImmersive;
private static boolean cached = false;
@SuppressLint ("NewApi")
public static boolean hasImmersive(Context ctx) {
if (!cached) {
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
hasImmersive = false;
cached = true;
return false;
}
Display d = ((WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
DisplayMetrics realDisplayMetrics = new DisplayMetrics();
d.getRealMetrics(realDisplayMetrics);
int realHeight = realDisplayMetrics.heightPixels;
int realWidth = realDisplayMetrics.widthPixels;
DisplayMetrics displayMetrics = new DisplayMetrics();
d.getMetrics(displayMetrics);
int displayHeight = displayMetrics.heightPixels;
int displayWidth = displayMetrics.widthPixels;
hasImmersive = (realWidth > displayWidth) || (realHeight > displayHeight);
cached = true;
}
return hasImmersive;
}