状态栏透明方法:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
或
<item name="android:windowTranslucentStatus">true</item>
第一种方法是在代码中设置,在setContentView()之前设置。
第二种方法在Activity的主题Theme文件中设置。
这两种方法更多的用户4.4版本的沉浸式状态栏效果,其主要是将状态栏的颜色设置为透明,自动将当前窗口内的布局整体上移一个statusbar的高度。所以,在4.4版本上做沉浸式,需要单独增加一个状态栏高度的view,用来占位。但是这种思路的方案在6.0上也能够实现。有两种方案:
方案一
private void sinkStatusBar1() {
// 在4.4开始,通过设置windowTranslucentStatus来透明话状态栏
// 或者在style中通过设置"android:windowTranslucentStatus"为true来设置
// 但是,仅仅设置该属性, 应用标题栏和状态栏重叠了,相当于整个布局上移了StatusBar的高度。
// 下属方案是直接在content布局部分顶部增加一个占位组件,高度与statusbar高度相同
// 6.0上也可直接运行
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup rootView =
(ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
int count = rootView.getChildCount();
//判断是否已经添加了statusBarView
if (count > 0 && rootView.getChildAt(0) instanceof FakeStatusBarView) {
rootView.getChildAt(0).setBackgroundColor(calculateStatusBarColor());
} else {
FakeStatusBarView statusBarView = createFakeStatusBar();
rootView.addView(statusBarView, 0);
}
// }
}
方案二
private void sinkStatusBar2() {
// 在4.4开始,通过设置windowTranslucentStatus来透明话状态栏
// 或者在style中通过设置"android:windowTranslucentStatus"为true来设置
// 但是,仅仅设置该属性, 应用标题栏和状态栏重叠了,相当于整个布局上移了StatusBar的高度。
// 下述方案是直接在DecorView布局部分最后增加一个占位组件,高度与statusbar高度相同
// 6.0上也可直接运行
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//获取windowphone下的decorView
ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
int count = decorView.getChildCount();
//判断是否已经添加了statusBarView
if (count > 0 && decorView.getChildAt(count - 1) instanceof FakeStatusBarView) {
decorView.getChildAt(count - 1).setBackgroundColor(calculateStatusBarColor());
} else {
//新建一个和状态栏高宽的view
FakeStatusBarView statusView = createFakeStatusBar();
decorView.addView(statusView);
}
ViewGroup rootView = (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
//rootview不会为状态栏留出状态栏空间
ViewCompat.setFitsSystemWindows(rootView,true);
rootView.setClipToPadding(true);
// }
}
两种方案的区别,一个是在DecorView节点下增加一个占位View。而方案一是直接在DecorView的content布局节点内增加一个占位View。