华为(HuaWei)虚拟按键的判断和监听


最近在项目里遇到华为手机的虚拟按键对于布局的挤压导致组件压缩,没办法,华为商务手机贼多,视而不见是不可能的。另外在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做出相应的处理便可。
也许你有更好的方法,务必留言告诉我^_^

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值