您的位置:首页 > 其它

Fragment切换中适配"沉浸式状态栏"

2018-03-18 16:28 323 查看
传送门:

fitSystemWindow属性的作用

http://blog.csdn.net/wangxp423/article/details/79564244

fitSystemWindow属性实战

http://blog.csdn.net/wangxp423/article/details/79566465

适配“沉浸式”状态栏

http://blog.csdn.net/wangxp423/article/details/79596329

前三篇我们讲解实现“沉浸式”状态栏相关的一些代码。本篇我们讲述在Fragment切换的时候适配”沉浸式”状态栏

一:前提

本篇是在上面三篇的第三篇《适配“沉浸式状“态栏》传送门;在这一篇的基础上的第二种适配方案(顶部添加View,修改View颜色)的基础上进行的。

此篇中的顶部的标题栏是写在Fragment的布局中的。而不是写在外部Activity的布局中。如果写在外部的话就更简单了。

二,适配效果图

下图是小米6.0.1系统适配效果



下图是5.0系统适配效果



我们可以效果是可以的,适配规则也是按照第三篇中的规则进行适配的。

三,主要部分代码

这一部分主要是fragment切换代码,主要就是切换的时候控制添加View的显示和隐藏,根据标题栏背景色是否是浅色,控制状态栏字体和图标颜色。

@OnClick(R.id.fragment_title_blue)
public void changeTitleBlue() {
setStatusBarPlaceVisible(true);
setViewColorStatusBar(false,getResources().getColor(R.color.colorPrimary));
selectFragment(0);
}

@OnClick(R.id.fragment_title_red)
public void changeTitleRed() {
setStatusBarPlaceVisible(true);
setViewColorStatusBar(false,getResources().getColor(R.color.colorAccent));
selectFragment(1);
}

@OnClick(R.id.fragment_title_white)
public void changeTitleWhite() {
setStatusBarPlaceVisible(true);
setViewColorStatusBar(true,Color.WHITE);
selectFragment(2);
}

@OnClick(R.id.fragment_title_image)
public void changeTitleImage() {
setStatusBarPlaceVisible(false);
setViewColorStatusBar(false,Color.WHITE);
selectFragment(3);
}


/**
* 根据版本不同 修改添加View的颜色
* 适配白底标题栏(方案二)顶部添加View,改变View颜色
* 适配方案2, 4.4以下的不适配,4.4-6.0修改View颜色为浅灰色,6.0以上修改View颜色为白色,修改状态栏字体颜色
*
* @param isLight 标题栏颜色是否为浅色(白色)
*/
protected void setViewColorStatusBar(boolean isLight, int statusBarPlaceColor) {
//6.0+ 小米 魅族 可以直接适配 一般情况下6.0以上都是透明
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M || OsUtil.isMIUI() || OsUtil.isFlyme()) {
setStatusBarTextDark(isLight);
setStatusBarPlaceColor(statusBarPlaceColor);
} else {
if (statusBarPlaceColor == Color.WHITE) {
statusBarPlaceColor = 0xffcccccc;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { //4.4以上修改为浅灰色
setStatusBarPlaceColor(statusBarPlaceColor);
} else { //4.4以下不适配
setStatusBarPlaceVisible(false);
}
}
}

protected void setStatusBarPlaceVisible(boolean isVisible){
if (isVisible){
mViewStatusBarPlace.setVisibility(View.VISIBLE);
} else{
mViewStatusBarPlace.setVisibility(View.GONE);
}
}

protected void setStatusBarPlaceColor(int statusColor) {
if (mViewStatusBarPlace != null) {
mViewStatusBarPlace.setBackgroundColor(statusColor);
}
}


fragment中代码就不贴了,前三个图片就是线性布局中一个标题栏一个TextView,第四个就是一个ImageView。

这里在简单说一下:

//本来想以第三篇中的第一种适配方式来写,且标题栏是在fragment中的,以为会比较简单,结果遇到了诸多问题。简单说一下问题吧。

//第一种适配方式修改状态栏颜色,主要配合的是fitSystemWindow属性。他作用于布局文件中的第一个View中,如果后面的View也设置这个属性是无效的。

//用这个属性在Fragment切换的时候有下面弊端,下面简单介绍一下

//1,如果fitSystemWindow设置在Fragment里面的第一个View中,在切换的时候发现只有第一个生效,后面的fragment不生效。

//2,如果从有标题栏切换到无标题栏,即顶端是大图的情况,不需要有fitSystemWindow的属性,即该属性需要是false。(这个我没有试过不知道是否切换设置是否生效,大家可以试一下)

//如果用第一种方案进行适配,最好是标题栏在外部Activity里面,只需要控制标题栏的颜色和显示隐藏,大家有兴趣的可以试一下。

下面上源码在(StatusBar研究)里面,欢迎交流

https://github.com/wangxp423/ViewExercise

个人公众号“Code之旅”



欢迎扫码关注个人公众号“Code之旅”

个人gitHub地址:https://github.com/wangxp423
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息