我正在编写一个带透明导航栏的Android应用程序.要相应地调整布局,我需要知道设备是否有软件或硬件按钮.
在我的研究期间,我遇到了以下解决方案:
boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
Run Code Online (Sandbox Code Playgroud)
这种方法不适用于三星Note 4或HTC One等新设备,它们没有菜单键,但仍有硬件按钮.
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasHomeKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME);
boolean hasHardwareButtons = hasBackKey && hasHomeKey;
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为一些设备,如索尼Xperia Z3 Compact,虽然它有一个软件导航栏,但它返回true.
有没有可靠的方法来确定是否有物理按钮或软件导航栏?
这里发布的答案就是诀窍.为了完整起见,这是我现在使用的代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9307 次 |
| 最近记录: |