好久没码字了,所以出来冒个泡
一直用着华为的手机,从一开始就觉得华为的虚拟导航栏用着还是挺顺手的,后来发现越来越多的机子都开始使用起来,查看源码发现,虚拟导航栏是属于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;
}
}
经测试,手上大部分手机都能正确得到结果,支持无虚拟按键的判断。
手机码字挺不容易的
附上一个民咕噜的表情包娱乐一下_