android 虚拟导航监听,Android另类判断NavigationBar虚拟导航栏状态

好久没码字了,所以出来冒个泡

一直用着华为的手机,从一开始就觉得华为的虚拟导航栏用着还是挺顺手的,后来发现越来越多的机子都开始使用起来,查看源码发现,虚拟导航栏是属于SystemUI的一部分。

再一看手机,还提供了隐藏虚拟按键的按钮,于是就想,能不能有一个方法判断导航栏是否显示?基于不重复造轮子的思想,先是网上搜索了一把,方法都大同小异,但一用,发现挺多新手机都无法适配,于是从另一种方向思考如何判断NavigationBar虚拟导航栏是否显示?

思考:从DecorView这个神View入手,因为考虑到我们码的代码基本都在DecorView中一个id为android.R.id.content的容器中,那好,就根据content的容器宽高判断虚拟导航栏是否显示,于是就有了下面的代码。

package com.lkuan.gek.util;

import android.content.Context;

import android.content.res.Configuration;

import android.graphics.Point;

import android.graphics.Rect;

import android.support.annotation.NonNull;

import android.view.Display;

import android.view.View;

import android.view.Window;

/**

* @author lkuan

* Create on 2018/5/25

*/

public class NavigationBarUtil {

/**

* 判断虚拟导航栏是否显示

*

* @param context 上下文对象

* @param window 当前窗口

* @return true(显示虚拟导航栏),false(不显示或不支持虚拟导航栏)

*/

public static boolean checkNavigationBarShow(@NonNull Context context, @NonNull Window window) {

boolean show;

Display display = window.getWindowManager().getDefaultDisplay();

Point point = new Point();

display.getRealSize(point);

View decorView = window.getDecorView();

Configuration conf = context.getResources().getConfiguration();

if (Configuration.ORIENTATION_LANDSCAPE == conf.orientation) {

View contentView = decorView.findViewById(android.R.id.content);

show = (point.x != contentView.getWidth());

} else {

Rect rect = new Rect();

decorView.getWindowVisibleDisplayFrame(rect);

show = (rect.bottom != point.y);

}

return show;

}

}

经测试,手上大部分手机都能正确得到结果,支持无虚拟按键的判断。

手机码字挺不容易的

附上一个民咕噜的表情包娱乐一下_

a10ccf8e04bd

图片发自简书App

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值