最近在项目里遇到华为手机的虚拟按键对于布局的挤压导致组件压缩,没办法,华为商务手机贼多,视而不见是不可能的。另外在Google Nexus 6P(华为代工)也有虚拟按键,但是在适配上没有问题。为了适配令人蛋疼的各种分辨率,我布局采取的是百分比布局,但是依旧败在了华为的需按键上,表现为如果隐藏虚拟按键(可在设置里的导航栏找到相关设置),布局就显示正常了,WTF..。所以华为的虚拟按键应该是不同于谷歌原生虚拟按键的一种存在,它是实实在在“侵占”了手机屏幕的尺寸的,实际于是做了一些Search,现在总结一下。
首先先判断是否是华为手机:
/**
* 是否是华为
*/
public static boolean isHUAWEI() {
return android.os.Build.MANUFACTURER.equals("HUAWEI");
}
然后再判断是否有虚拟按键:
//获取是否存在NavigationBar
public static boolean checkDeviceHasNavigationBar(Context context) {
boolean hasNavigationBar = false;
try {
Resources rs = context.getResources();
int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
if (id > 0) {
hasNavigationBar = rs.getBoolean(id);
}
Class systemPropertiesClass = Class.forName("android.os.SystemProperties");
Method m = systemPropertiesClass.getMethod("get", String.class);
String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
hasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
hasNavigationBar = true;
}
} catch (Exception e) {
}
return hasNavigationBar;
}
最后再监听一下虚拟按键的切换:
getContentResolver().registerContentObserver(Settings.System.getUriFor
("navigationbar_is_min"), true, mNavigationStatusObserver);
private ContentObserver mNavigationStatusObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
int navigationBarIsMin = Settings.System.getInt(getContentResolver(),
"navigationbar_is_min", 0);
if (navigationBarIsMin == 1) {
//导航键隐藏了
} else {
//导航键显示了
}
}
};
在监听方法里对你的布局的onLayout和OnMesure做出相应的处理便可。
也许你有更好的方法,务必留言告诉我^_^