已经2017年了。到现在为止 相信各位android开发工程师们已经做过了很多的app. 肯定会遇到过状态栏背景色的问题。 各个版本的问题怎么去考虑 (主要是 4.4 5. 0 ), 你会说 现在2017年了 还会有4.4吗。 很遗憾 还是有20%左右。 所以 还是要考虑兼用的问题。 好吧 让我们开始正题
(先整明白几种概念)
1 全屏状态 :默认不显示状态栏,下拉才有状态栏
2.沉浸模式 :状态栏仍然一直存在,只不过背景颜色设为透明之后,布局向上填充了 。这种情况下如果在根布局中加入Android:fitsSystemWindows=”true”这个配置,布局就不会向上填充,而是把布局的背景色填充到状态栏背景区域。
3.变色龙模式 :状态栏仍然一直存在,只不过背景颜色改变了,这种情况状态栏只是颜色改变了,并不会被布局填充。
通俗的讲就是5.0之前的我们用的沉浸式SystemBarTintManager 这个东西只是布局的颜色被填充了,布局的结构没有变动,当然前提是 你的背景先要设置透明
之后的可以用变色龙模式 我们可以主动设置颜色。也就是5.0以后的方法
当然SystemBarTintManager 这种方法对5.0也有效,并且5.0中单独使用代码或者主题设置都可以实现。但4.4系统必须在应用中res目录下创建values-v19文件夹并新建一个style文件,然后在文件中添加主题并且同事使用SystemBarTintManager 代码并且同事设置沉浸式才能修改状态栏颜色成功。
这个也就是意味着你必须要添加的属性。 在4.4 如果你不弄成透明 没有办法颜色沉浸上去。这个属性作用 下面有效果图
里面这句话是重点这个也就是意味着你必须要添加的属性。 在4.4 如果你不弄成透明 没有办法颜色沉浸上去,就是你不设置他本身有这个颜色。 你设置的颜色是沉浸不上去的。
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintResource(R.color.red);
并且需要同事用代码和注意设置才能实现,并且只有在设置了沉浸式状态下才可以设置状态栏颜色成功,源码中注释如下:大概格式 后面详述
private void initStatusBar() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
}
}
在这里引用别人的几句话。
4.4系统可以设置状态栏透明windowTranslucentStatus:
状态栏透明之后下面布局会自动填充到状态栏,可以通过添加一个和状态栏等高的布局来填充并设置颜色。
5.0系统可以直接通过主题设置colorPrimaryDark状态栏颜色,且底部布局不会自动填充
好吧我想我还想要啰嗦一下,下面是你需要知道的。
1 主题
这是5.0的方法 有印象即可。后面有详述
这个是AppCompatActivity下的
所以在你下面写的
的时候前面不需要添加android: 类似 android:windowActionBar 这是不对的 这会报错。
2 本文用到的主题
Theme,AppCompat.DayNight 这个说白了就是可以设置页面模式了 相比以前来说简单了很多。
主要方法
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);
另外放置的位置也要在serview之前才能生效。 具体的可以去搜索
3 强调几个属性的作用
- false
- true
- @android:color/transparent
- true
我们下面来用图说话。要不我是不能理解的
先来一个我们设置true
接下来来一个false
第一个属性很明显就是可以拉升到顶部状态栏,并且定义顶部状态栏透明
上面是我手机4.4 做这个必须要新建一个values-v19文件夹
下面看一下 模拟器5.0
这个是true
这个是false
额还是没有看出来区别 在高的版本因为一些原因没有办法实验。 但是另一个用图修改字体图片的颜色我们是可以肯定的
上面是我盗的图。 你想改变这个颜色 那就只能用false
还有一点 就是想要这个效果要要6.0 api23 之上 这个就是你要注意的地方。
(另外在说点。 这个效果。实际上本人觉得并没有什么用。白色是一个默认值。当然也会有不同的地方,我记得小米的一款手机就是黑色。 所以这个影响不是特别大。并且真的想要好的效果的话,可以考虑透明化。整个替换状态栏。 这个要求是android5.0 这里不做特别说明)
这个颜色变幻时6.0 也就是说低于这个版本没有
- true
低于5.0 没有
- @android:color/transparent
正题开始 首先先要确定手机的版本。4.4需要单写value。5.0以后不需要。他可以直接设置颜色
if(Utils.hasLollipop()){
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
5.0以后可以用getWindow().setStatusBarColor()自定义状态栏背景色
}
else if(Utils.hasKitKat()){
setTheme(R.style.Theme_Document_Translucent);
}顾名思义这个是判断两个版本的条件
public void setUpStatusBar() {
int color = Utils.getStatusBarColor(SettingsActivity.getPrimaryColor(this));
if(Utils.hasLollipop()){
getWindow().setStatusBarColor(color);
这个是满足第一个版本的条件 。5.0以上可以直接设置颜色
}
else if(Utils.hasKitKat()){
SystemBarTintManager systemBarTintManager = new SystemBarTintManager(this);
systemBarTintManager.setTintColor(color);
systemBarTintManager.setStatusBarTintEnabled(true);
这个是低版本的用沉浸式,当然5.0以后也可以用这个
}
}
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.setTitleTextAppearance(context, R.style.TextAppearance_AppCompat_Widget_ActionBar_Title);
if(Utils.hasKitKat() && !Utils.hasLollipop()) {
((LinearLayout.LayoutParams) mToolbar.getLayoutParams()).setMargins(0, getStatusBarHeight(this), 0, 0);
mToolbar.setPadding(0, getStatusBarHeight(this), 0, 0);
}
setSupportActionBar(mToolbar);下面这个就是在4.4 不是5的时候 toolbar的设置问题 获取到tStatusBar的高度
剩下的明天继续补充。 欢迎留言
下一章 toolbar的颜色 和状态栏的颜色
http://www.jianshu.com/p/3d50b4fad310