判断是否有 虚拟键
public void hasNav1(){
private boolean hasSoftKeys(WindowManager windowManager){
Display d = windowManager.getDefaultDisplay();
DisplayMetrics realDisplayMetrics = new DisplayMetrics();
d.getRealMetrics(realDisplayMetrics);
int realHeight = realDisplayMetrics.heightPixels;
int realWidth = realDisplayMetrics.widthPixels;
DisplayMetrics displayMetrics = new DisplayMetrics();
d.getMetrics(displayMetrics);
int displayHeight = displayMetrics.heightPixels;
int displayWidth = displayMetrics.widthPixels;
//return (realWidth - displayWidth) > 0 || (realHeight - displayHeight) > 0;
return realHeight > displayHeight ;
}
private boolean hasNav2(){
int dpi = 0;
Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics dm =new DisplayMetrics();
Class c;
try{
c = Class.forName("android.view.Display");
Method method = c.getMethod("getRealMetrics",DisplayMetrics.class);
method.invoke(display, dm);
dpi=dm.heightPixels;
}catch(Exception e){
}
return dpi > getWindowManager().getDefaultDisplay().getHeight() ;
}
隐藏虚拟键(解决兼容性的。setup界面,覆盖关机界面或者其他界面可能引起的问题)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStatusBar();
//添加监听,防止覆盖,或者上层有其他view 导致 Navigation显示
getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener(){
@Override
public void onSystemUiVisibilityChange(int visibility) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
);
}
});
}
//初始化设置
public void setStatusBar() {
changeSystemUIFlag();
//getWindow().setStatusBarColor(Color.TRANSPARENT);
getWindow().setNavigationBarColor(Color.TRANSPARENT);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if(hasFocus){
//还必须加这个,
changeSystemUIFlag();
}
}
public void changeSystemUIFlag() {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
//重点,这里必须加, onchange 必须去掉----
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE
//| View.SYSTEM_UI_FLAG_FULLSCREEN
);
}
dialog 隐藏虚拟键
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ;
dialog.getWindow().getDecorView().setSystemUiVisibility();
dialog.show();
普通 activity 隐藏
/**
* 隐藏虚拟按键,并且全屏
*/
protected void hideBottomUIMenu() {
if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
View v = this.getWindow().getDecorView();
v.setSystemUiVisibility(View.GONE);
} else if (Build.VERSION.SDK_INT >= 19) {
//for new api versions.
View decorView = getWindow().getDecorView();
int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY ;
decorView.setSystemUiVisibility(uiOptions);
}
}
其他方式 https://blog.csdn.net/silence_jjj/article/details/78095784 还没试
class TestActivity implements ViewTreeObserver.OnGlobalLayoutListener{
public void oncreate(){
content.getViewTreeObserver().addOnGlobalLayoutListener(ViewTreeObserver.OnGlobalLayoutListener {
Log.e("eeeee", "界面有调整")
if (content.height != mHeight) {
hideNavigationBar() // 隐藏导航栏
Log.e("eeeeee", content.height.toString())
if (mHeight == 0) {
mHeight = content.height
}
}
})
}
// 注意取消监听
override fun onDestroy() {
super.onDestroy()
content.getViewTreeObserver().removeOnGlobalLayoutListener(this)
}
}