Android 状态栏的隐藏和显示
在Android应用中我们可能会碰到这样的需求,隐藏状态栏或者状态栏和应用背景一样的颜色,比如下图:
状态栏和背景一个颜色
Android应用程序的界面上系统元素构成如下图:
在4.1之后的系统,隐藏状态栏可以设置DecorView的option参数。关于DecorView,这里也简单介绍下,先用一张图看下它的位置关系
也就是说DecorView是Activity窗口的根视图。每个activity都对应一个窗口window,这个窗口是PhoneWindow的实例,PhoneWindow对应的布局是DecirView,是一个FrameLayout,DecorView内部又分为两部分,一部分是ActionBar,另一部分是ContentParent,即activity在setContentView对应的布局。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View decorView = getWindow().getDecorView();
int option = View.SYSTEM_UI_FLAG_FULLSCREEN;
decorView.setSystemUiVisibility(option);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
}
}
SYSTEM_UI_FLAG_FULLSCREEN 的作用就是隐藏状态栏,点击屏幕的时候不会出现,下拉的时候会出现,相应的字段还有:
SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 将布局内容拓展到导航栏的后面
虽说这才是正统的沉浸式含义,但有些朋友可能想实现的就是饿了么那样的状态栏效果,而不是直接把整个系统状态栏给隐藏掉,那么又该如何实现呢
这个状态栏隐藏了,但是想像饿了么那样设置成透明效果,应该如何做呢?只要将option改为如下就可以了
状态栏透明int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
同时 将 StatusBar颜色设置为透明的
getWindow().setStatusBarColor(Color.TRANSPARENT);
注意两个Flag必须要结合在一起使用,表示会让应用的主体内容占用系统状态栏的空间。
另外看下底下的导航栏如何隐藏,其实也是使用了不同的UI Flag而已
int option = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;
这里我们同时使用了SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN,这样就可以将状态栏和导航栏同时隐藏了。现在重新运行一下程序,效果如图所示: