View decorView = getWindow().getDecorView();
decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == 0) {
new ToastUtil(mContext).showToast("11111");
}else {
new ToastUtil(mContext).showToast("22222");
}
}
});
最优解
private static Handler sHandler;
Runnable mHideRunnable = () -> {
int flags;
int curApiVersion = Build.VERSION.SDK_INT;
// This work only for android 4.4+
if (curApiVersion >= Build.VERSION_CODES.KITKAT) {
// hide navigation bar permanently in android activity
// touch the screen, the navigation bar will not show
flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE
| View.SYSTEM_UI_FLAG_FULLSCREEN;
} else {
// touch the screen, the navigation bar will show
flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
}
// must be executed in main thread
getWindow().getDecorView().setSystemUiVisibility(flags);
};
sHandler = new Handler();
sHandler.post(mHideRunnable); // hide the navigation bar
decorView.setOnSystemUiVisibilityChangeListener(visibility -> {
sHandler.post(mHideRunnable); // hide the navigation bar
if (visibility == 0) {
lp.height = DisplayUtil.getScreenH(mContext) - titleHeight - DisplayUtil.getNavigationBarHeight(mContext);
} else {
lp.height = DisplayUtil.getScreenH(mContext) - titleHeight;
}
window.setAttributes(lp);
});
判断是否隐藏虚拟导航键---尝试方法
/**
*
* @param context
* @return 返回true表示显示虚拟导航键、false表示隐藏虚拟导航键
*/
public static boolean hasNavigationBar(Context context) {
//navigationGestureEnabled()从设置中取不到值的话,返回false,因此也不会影响在其他手机上的判断
return deviceHasNavigationBar() && !navigationGestureEnabled(context);
}
/**
* 获取主流手机设置中的"navigation_gesture_on"值,判断当前系统是使用导航键还是手势导航操作
* @param context app Context
* @return
* false 表示使用的是虚拟导航键(NavigationBar),
* true 表示使用的是手势, 默认是false
*/
private static boolean navigationGestureEnabled(Context context) {
int val = Settings.Global.getInt(context.getContentResolver(), getDeviceInfo(), 0);
return val != 0;
}
/**
* 获取设备信息(目前支持几大主流的全面屏手机,亲测华为、小米、oppo、魅族、vivo、三星都可以)
*
* @return
*/
private static String getDeviceInfo() {
String brand = Build.BRAND;
if(TextUtils.isEmpty(brand)) return "navigationbar_is_min";
if (brand.equalsIgnoreCase("HUAWEI")||"HONOR".equals(brand)) {
return "navigationbar_is_min";
} else if (brand.equalsIgnoreCase("XIAOMI")) {
return "force_fsg_nav_bar";
} else if (brand.equalsIgnoreCase("VIVO")) {
return "navigation_gesture_on";
} else if (brand.equalsIgnoreCase("OPPO")) {
return "navigation_gesture_on";
} else if(brand.equalsIgnoreCase("samsung")){
return "navigationbar_hide_bar_enabled";
}else {
return "navigationbar_is_min";
}
}
/**
* 判断设备是否存在NavigationBar
*
* @return true 存在, false 不存在
*/
public static boolean deviceHasNavigationBar() {
boolean haveNav = false;
try {
//1.通过WindowManagerGlobal获取windowManagerService
// 反射方法:IWindowManager windowManagerService = WindowManagerGlobal.getWindowManagerService();
Class<?> windowManagerGlobalClass = Class.forName("android.view.WindowManagerGlobal");
Method getWmServiceMethod = windowManagerGlobalClass.getDeclaredMethod("getWindowManagerService");
getWmServiceMethod.setAccessible(true);
//getWindowManagerService是静态方法,所以invoke null
Object iWindowManager = getWmServiceMethod.invoke(null);
//2.获取windowMangerService的hasNavigationBar方法返回值
// 反射方法:haveNav = windowManagerService.hasNavigationBar();
Class<?> iWindowManagerClass = iWindowManager.getClass();
Method hasNavBarMethod = iWindowManagerClass.getDeclaredMethod("hasNavigationBar");
hasNavBarMethod.setAccessible(true);
haveNav = (Boolean) hasNavBarMethod.invoke(iWindowManager);
} catch (Exception e) {
e.printStackTrace();
}
return haveNav;
}