废话前言
沉浸式真的是个难啃的的东西。不易理解,也是困惑了我好久,现在有时间,来读一读网上大神的帖子学习一下,加上自己的理解。实现起来还是不难的。
只说一种实现起来最简单,最清晰的方法。
三个文件搞定
第一个
res/values/style.xml
<resources
<!--全屏显示,无透明状态栏-->
<style name="TranslucentTheme" parent="AppTheme">
<item name="android:windowFullscreen">true</item>
</style>
<!--全屏显示,有透明状态栏-->
<style name="statusBar" parent="AppTheme">
</style>
</resources>
第二个
res/values-v19/style.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!--values-v19。v19 开始有 android:windowTranslucentStatus 这个属性,全屏显示,无透明状态栏-->
<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="android:windowFullscreen">true</item>
</style>
<!--全屏显示,有透明状态栏-->
<style name="statusBar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
</resources>
第三个
res/values-v21/style.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- values-v21。5.0 以上提供了 setStatusBarColor() 方法设置状态栏颜色。全屏显示,无透明状态栏-->
<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">true</item>
<!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
<item name="android:statusBarColor">@android:color/transparent</item>
<!--全屏显示-->
<item name="android:windowFullscreen">true</item>
</style>
<!--全屏显示,有透明状态栏-->
<style name="statusBar" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">true</item>
<!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
</resources>
最后把你的需要的name填写到AndroidManifest.xml内Application的theme中就可以了
就这样就实现了
敲黑板:
1.三个文件缺一不可,有了这三个文件,整个屏幕的都是你的地盘
2.分别说一下style的TranslucentTheme和statusBar:
TranslucentTheme比statusBar多一句话:<item name="android:windowFullscreen">true</item>
加上这句话,透明的状态栏都不会出现,整个屏幕都是你的地盘
去掉这句话也就是statusBar
在顶部出现了透明状态栏。
小结
理论上到这里就结束了,但是类似QQ的那种纯色的状态栏也就没事实现,也就是给状态栏加上背景色。下面我们来做
进阶
我们需要把状态栏的高度给占住,就可以了,有三个办法
办法一
设置 fitsSystemWindows 属性,这种方法不说了,弊端太多,有兴趣可以去了解一下
办法二
手动添加一个view
<View
android:id="@+id/statusBarView"
android:background="@color/blue"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</View>
然后再代码中获取状态栏的高度,赋值给此view。
/**
* 利用反射获取状态栏高度
* @return
*/
public int getStatusBarHeight() {
int result = 0; //获取状态栏高度的资源id
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
开始赋值
View statusBar = findViewById(R.id.statusBarView);
ViewGroup.LayoutParams layoutParams = statusBar.getLayoutParams();
layoutParams.height = getStatusBarHeight();
或者不在xml内写View,直接在代码中动态添加
ViewGroup contentView = (ViewGroup) this.findViewById(android.R.id.content);
View statusBarView = new View(this);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight());
statusBarView.setBackgroundColor(Color.parseColor("#6495ED"));//设置背景颜色
contentView.addView(statusBarView, lp);
办法三
手动给根视图设置一个 paddingTop,高度为状态栏高度,
然后再在根视图加入一个占位视图,其高度也设置为状态栏高度。
//设置 paddingTop
ViewGroup rootView = (ViewGroup) mActivity.getWindow().getDecorView().findViewById(android.R.id.content);
rootView.setPadding(0, getStatusBarHeight(mActivity), 0, 0);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.0 以上直接设置状态栏颜色
activity.getWindow().setStatusBarColor(color);
} else {
//根布局添加占位状态栏
View statusBarView = new View(activity);
ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
statusBarView.setBackgroundColor(Color.parseColor("#6495ED"));
decorView.addView(statusBarView, lp);
到这里基本结束了。
总结
1.无论怎样都要建立三个xml文件
2.在有纯色状态栏的情况下,办法二、三都可以很方便的搞定状态栏。
3.办法三我没有验证,是直接搬过来的