由于有的手机带有NavigationBar(导航栏),所以会涉及到适配问题,这里介绍几种NavigationBar常用判断:
1. 判断手机是否带有NavigationBar
//获取是否存在NavigationBar
public static boolean checkDeviceHasNavigationBar(Context context) {
boolean hasNavigationBar = false;
Resources rs = context.getResources();
int id = rs.getIdentifier("config_showNavigationBar", "bool", "android");
if (id > 0) {
hasNavigationBar = rs.getBoolean(id);
}
try {
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;
}
2.如果有NavigationBar,判断NavigationBar是否隐藏了
if (checkDeviceHasNavigationBar(getContext())==true){
//对最外层布局进行滑动监听
ll_mf.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener(){
@Override
public void onGlobalLayout(){
//获取屏幕尺寸,不包括虚拟功能高度 getActivity().getWindowManager().getDefaultDisplay()
// 当两者高度相等时,说明导航栏隐藏了
if(getActivity().getWindowManager().getDefaultDisplay().getHeight()==getDpi()){
//do some things
}
}
});
}
// 获取屏幕原始尺寸高度,包括虚拟功能键高度
private int getDpi()
{
int dpi = 0;
Display display = getActivity().getWindowManager().getDefaultDisplay();
DisplayMetrics dm =new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try{
c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics",DisplayMetrics.class);
method.invoke(display, dm);
dpi=dm.heightPixels;
}catch(Exception e){
e.printStackTrace();
}
return dpi;
}
getActivity().getWindowManager().getDefaultDisplay()是获取屏幕尺寸,不包括虚拟功能高度 。