隐藏底部工具栏只有在能获取到Window的地方才能实现,比如果activity,dialog等
在activity中隐藏底部工具栏的方法
隐藏底部工具栏可以在任意的界面对象中实现,dialog,悬浮窗,等等,只要有view对象就可以。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//底部状态栏位置消失,但是状态栏还是存在
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//底部状态栏位置消失,但是状态栏还是存在
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//底部状态栏位置消失,但是状态栏还是存在
//这种方法也行,但是要在Android 4.0以上才能生效
// getWindow().getDecorView().setSystemUiVisibility(
// View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
// | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
// | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
//取消标题
requestWindowFeature(Window.FEATURE_NO_TITLE);
//取消状态栏
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//隐藏虚拟按键(底部工具栏),并且全屏
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 | View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(uiOptions);
}
}
在oncreate隐藏这个是没有问题,但是当我们需要弹出dialog(也调用了隐藏工具栏的方法)的时候,底部工具栏就会重新出现然后消失,dialog消失的时候,底部工具栏会再次出现,activity隐藏底部工具栏的设置就会失效,那我们就需要在焦点变化的时候调用。
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
这样底部工具栏的设置就不会失效了。但是,在dialog出现和隐藏的瞬间,底部工具栏都会出现,很尴尬的问题,我慢慢再找解决方法吧,现在我是用悬浮窗代替一些不是全屏的dialog。
提一下
如果需要全屏的悬浮窗的时候,我们是不能隐藏工具栏占用的区域的,因为悬浮窗没有window对象,所以我现在把有问题的全屏悬浮窗都改成了dialog。
一知半解真可怕,只会看博客,不自己看源码钻研真是尴尬,哎,是我理解错了,在隐藏底部工具栏的时候是通过调用setSystemUiVisibility(int)
这个方法,这个方法我一直以为是window的方法。。。。其实是view的方法,那这样的话,我们就可以使用一个界面里的任意一个view
对象调用此方法了。也就不会出现所谓的悬浮窗不能隐藏底部工具栏的问题了。只会复制,不认真看代码是一个非常非常蠢得行为!
遗留问题:
dialog显隐的时候,底部工具栏会出现一瞬间的闪现。(可以使用悬浮窗带滴dialog,但是没有解决根本问题)
问题解决:
在activity中打开dialog时,底部状态栏会出现然后消失。这个问题的解决是在dialog显示之前将dialog的焦点失能,然后在显示之后清理失能焦点。
public void show(String type,String mes){
//失能焦点
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
super.show();
//清理失能焦点
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
}
参考:android 隐藏底部的 菜单栏
android隐藏底部虚拟键Navigation Bar实现全屏
Android dialog 弹出时,保持 隐藏 navigation bar(虚拟栏)
网友评论