NavigationBarUtil
import android.app.Activity;
import android.content.Context;
import android.content.ContextWrapper;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.FitWindowsLinearLayout;
public class NavigationBarUtil {
/**
* 隐藏虚拟栏 ,显示的时候再隐藏掉
*/
static public void hideNavigationBar(Window window1) {
final Window window = window1;
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
window.getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
//布局位于状态栏下方
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |
//全屏
View.SYSTEM_UI_FLAG_FULLSCREEN |
//隐藏导航栏
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION |
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
window.getDecorView().setSystemUiVisibility(uiOptions);
}
});
}
/**
* dialog 需要全屏的时候用,和clearFocusNotAle() 成对出现
* 在show 前调用 focusNotAle show后调用clearFocusNotAle
*/
static public void focusNotAle(Window window) {
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
/**
* dialog 需要全屏的时候用,focusNotAle() 成对出现
* 在show 前调用 focusNotAle show后调用clearFocusNotAle
*/
static public void clearFocusNotAle(Window window) {
window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
public static boolean IsNavigationbarOpen(Context context) {
ViewGroup rootLinearLayout = findRootLinearLayout(context);
int navigationBarHeight = 0;
if (rootLinearLayout != null) {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) rootLinearLayout.getLayoutParams();
navigationBarHeight = layoutParams.bottomMargin;
}
return navigationBarHeight != 0;
}
/**
* 导航栏高度,关闭的时候返回0,开启时返回对应值
*/
public static int getNavigationBarHeight(Context context) {
ViewGroup rootLinearLayout = findRootLinearLayout(context);
int navigationBarHeight = 0;
if (rootLinearLayout != null) {
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) rootLinearLayout.getLayoutParams();
navigationBarHeight = layoutParams.bottomMargin;
}
return navigationBarHeight;
}
/**
* 从R.id.content从上遍历,拿到 DecorView 下的唯一子布局LinearLayout
* 获取对应的bottomMargin 即可得到对应导航栏的高度,0为关闭了或没有导航栏
*/
private static ViewGroup findRootLinearLayout(Context context) {
ViewGroup onlyLinearLayout = null;
try {
Window window = getWindow(context);
if (window != null) {
ViewGroup decorView = (ViewGroup) getWindow(context).getDecorView();
Activity activity = getActivity(context);
View contentView = activity.findViewById(android.R.id.content);
if (contentView != null) {
View tempView = contentView;
while (tempView.getParent() != decorView) {
ViewGroup parent = (ViewGroup) tempView.getParent();
if (parent instanceof LinearLayout) {
//如果style设置了不带toolbar,mContentView上层布局会由原来的 ActionBarOverlayLayout->FitWindowsLinearLayout)
if (parent instanceof FitWindowsLinearLayout) {
tempView = parent;
continue;
} else {
onlyLinearLayout = parent;
break;
}
} else {
tempView = parent;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return onlyLinearLayout;
}
private static Window getWindow(Context context) {
if (getAppCompActivity(context) != null) {
return getAppCompActivity(context).getWindow();
} else {
return scanForActivity(context).getWindow();
}
}
private static Activity getActivity(Context context) {
if (getAppCompActivity(context) != null) {
return getAppCompActivity(context);
} else {
return scanForActivity(context);
}
}
private static AppCompatActivity getAppCompActivity(Context context) {
if (context == null) return null;
if (context instanceof AppCompatActivity) {
return (AppCompatActivity) context;
} else if (context instanceof ContextThemeWrapper) {
return getAppCompActivity(((ContextThemeWrapper) context).getBaseContext());
}
return null;
}
private static Activity scanForActivity(Context context) {
if (context == null) return null;
if (context instanceof Activity) {
return (Activity) context;
} else if (context instanceof ContextWrapper) {
return scanForActivity(((ContextWrapper) context).getBaseContext());
}
return null;
}
}