如何判断导航键是否打开
原生的方法:
也是判断大多数手机导航键是否打开的方法。
public boolean hasNavigationBar (Resources resources)
{
int id = resources.getIdentifier("config_showNavigationBar", "bool", "android");
return id > 0 && resources.getBoolean(id);
}
这个 Resources 对象如何获取呢?如果是四大组件,直接调用 getResources() 方法即可。或者先获取一个 Context 对象,再通过 context.getResources() 获取 Resources 对象。
再看看原生代码 DisplayPolicy.java 中的写法:
if (mDisplayContent.isDefaultDisplay) {
mHasStatusBar = true;
mHasNavigationBar = mContext.getResources().getBoolean(R.bool.config_showNavigationBar);
// Allow a system property to override this. Used by the emulator.
// See also hasNavigationBar().
String navBarOverride = SystemProperties.get("qemu.hw.mainkeys");
if ("1".equals(navBarOverride)) {
mHasNavigationBar = false;
} else if ("0".equals(navBarOverride)) {
mHasNavigationBar = true;
}
} else {
mHasStatusBar = false;
mHasNavigationBar = mDisplayContent.supportsSystemDecorations();
}
主要是通过判断 config_showNavigationBar 这个属性的值,boolean 型,true 为导航键打开,false 为导航键关闭。这对于大多数手机是生效的。但对于个别手机,比如 vivo,这样判断还不够,判断这个值返回的永远是 true。不过没关系,还有方法。我们可以通过判断导航手势是否打开来判断导航键是否打开。
Settings.Secure.getInt(context.getContentResolver(), "navigation_gesture_on", 0);
我们通过获取系统数据库 navigation_gesture_on 这个字段的值来判断导航手势是否打开,1 为打开,0 为关闭,导航手势关闭即为导航键打开。这样我们就可以干很多事情,比如获取导航键的高度,做一些 UI 的适配等等。
导航键的判断就是这么简单。