在6.0 中 同一activity中 修改 actionbar, statusbar 颜色

在一个activity中, 在代码中动态修改actionbar和 状态栏的颜色
说真的为什么要用 actionbar。感觉难用死了,而且是改bug 基本要求在原代码基础上不变进行修改,如果添加自定义actionbar 自定义view 啥的又感觉好麻烦

一 、现状
1.默认是设置了activity 启动的style
(里面包括 状态栏的显示效果,actionbar或自定义多toolbar等的显示效果,)

2. 根据需求在变幻动画后,界面需要变化 需要修改等属性,因为为了适配下一个界面的效果(需求)

二、解决:
2.0 这里再重申下之前不同版本的要求状态栏和app风格一致的设置方式

4.4 -5.0 设置的透明状态栏(布局xml中也要设置)
values-v19/style.xml

     <style name="XXXX" parent="Theme.XXXX">
        <item name="android:windowTranslucentStatus">true</item>
        <item name="android:windowTranslucentNavigation">true</item>
       </style>

5.0以上 (当statusBarColor 和 colorPrimary 2个属性同时存在的话,状态栏的颜色是根据statusBarColor属性走的)
values-v21/style.xml

     当你的主题继承的是 普通的 就设置 当statusBarColor 就好了
       <style name="XXX" parent="XXXX">
         <item name="android:windowTranslucentStatus">false</item>   
         <!-- 其实为了适配的话这里就设置false 下面设置颜色比较好-->
         <item name="android:windowTranslucentNavigation">true</item>
         <!--Android 5.x  把颜色设置透明 , 或者直接设置状态栏的颜色与app风格一致也可以-->
         <item name="android:statusBarColor">@android:color/transparent</item>
       </style>

如果继承的是 Material 风格的主题
@android:style/Theme.Material (dark version)
@android:style/Theme.Material.Light (light version)
@android:style/Theme.Material.Light.DarkActionBar

与之对应的AppCompatTheme:
Theme.AppCompat
Theme.AppCompat.Light
Theme.AppCompat.Light.DarkActionBar

           <item name="colorPrimary">@android:color/holo_blue_bright</item>
           <item name="colorPrimaryDark">@android:color/holo_blue_bright</item>

2.1 修改状态栏 6.0 (这次需求的重点)

(1)代码中设置状态栏颜色

Window window = this.getWindow();
window.getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);     
window.setStatusBarColor(this.getResources().getColor(R.color.TCT_colorPrimary));

(2) 修改actionbar 的背景颜色

getActionBar().setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));

上面的这个代码是使actionbar的背景变成透明,效果看到后还是不错多,显示多总多背景色(但是我这边是需要actionbar 是另外一种色,而不是和总的背景布局颜色一样)

然后我照猫画虎,结果我都快哭了( 这样设置根本就没用如下,actionbar灰黑的,没有显示我要的颜色,可是我完全按照上面的格式走的呀)

getActionBar().setBackgroundDrawable(new ColorDrawable(R.color.BackBar));

最后实验出了正确的方式,能够显示正确的颜色,也不知道为什么非要这么写,谁知道就给我说说为什么

解决方案:

 getActionBar().setBackgroundDrawable(this.getBaseContext().getResources().getDrawable(R.drawable.BackBar));

(3)修改actionbar 字体的颜色
这个才是真真的日了狗了。我记得以前是有能设置多属性方法的
我现在修改的代码中, 他用的是 setTitle() 这个方法设置多标题, 这里我有个问题, 现在的这个 actandroid:windowIsTranslucentivity 默认继承的 style是 “@style/Theme.Material.Light.DarkActionBar” (当然继承后做了一些属性的修改) 然后代码用 setTitle()设置标题, actionbar本身也有1个 getActionBar().setTitle(spanText); 设置标题的方法
我2个分别都试了一下,效果是一样的,应该是因为主题的关系,所以这个默认的 setTitle() 的方法就是设置的actionbar的 标题
然后还专门实验了一下,果然是的(以前还真没注意过, 都是有actionbar 直接用actionbar 设置title的,果然看别人的代码还是能学到很多东西的,或者说对很多东西有更多的理解)
setTitle(spanText);
System.out.println( getActionBar().getTitle());
想要修改颜色,现在就只看到了这一个方法
setTitleColor()
但是设置了没有用,各种没用,气死宝宝了(acitvity一开始加载设置多颜色在style中设置好了,查了半天都不行,谁要是知道能设置的方法说谢谢)
最后找的另外一种解决方案

解决方案:

SpannableString spanText = new SpannableString("已完成");
// 设置字体的样式的
// spanText.setSpan(new TypefaceSpan("sans-serif"), 0, spanText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置颜色
spanText.setSpan(new ForegroundColorSpan(this.getResources().getColor(R.color.list_primary_text_color)),  0, spanText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
       getActionBar().setTitle(spanText);

(4)状态栏字体的颜色的问题,
网络上的也看了。也知道, 我们这个acitivty 一开始加载创建是 蓝色的主(actionbar,statusbar) 标题 和状态栏字体为白色中途因为逻辑的关系,需要把 actionbar, statusbar 变成灰白色,当然了,你的状态栏的字体肯定也要变啊,不然白色的就看不见了(和其他灰白色的界面效果一样)。
但是事实确是,没有变咯。
然后我看到模块中的style有个属性
android:windowLightStatusBar 然后查了一下,网上说,如果设置成true 就会动态的变化状态栏的字体和图标的颜色来优化
我就设置成
name=”android:windowLightStatusBar”
结果还是P 用都没有,状态栏还是白色的字。

最后解决方案:

Android 6.0 中提供了亮色状态栏模式,设置代码如下:
在获取window的时候 添加flag

Window window = this.getWindow();       
window.getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

三、然后就是理解这方面了,其中 activity的style
系统默认 statusbar 上面是黑色的,然后字体是白色的对把。
现在的这个activity,默认的话style
背景是蓝色的,
标题 是白色
需要状态栏字体也是白色(效果图)

设置的style属性一定要这样

android:windowIsTranslucent  false
android:windowLightStatusBar  true 

3.1
让6.0的状态栏字体适配自动变黑,自动变白
其中 windowIsTranslucent 是否半透明透明属性 设置为false
windowLightStatusBar 自定将状态栏字体优化 设置为 true

3.2

name="android:windowIsTranslucent"  true 
name="android:windowLightStatusBar" true

name="android:windowIsTranslucent" true
name="android:windowLightStatusBar" false

经过实验,在6.0上 以上2种属性设置,状态栏的字体颜色一直为白色,不管状态栏什么颜色(所以这个就可以满足一下现在我们这个页面的需求,需要状态栏字体为白色)按照我的理解,设置了window设置了透明属性,状态栏上的取色就不好取了,所以在同一个activity后面代码中设置了windowLightStatusBar 的属性,也不能改变状态栏的字体颜色

3.3 所以为了在同一个activity 设置不同颜色的状态栏字体

name=”android:windowIsTranslucent” true 必须为false
name=”android:windowLightStatusBar” false 这个设置为false
是你想要强行让他是白色的可以这样设置(因为为true的话会自动变色)

然后需要变色的时候

在代码中设置如下代码即可
Android 6.0 中提供了亮色状态栏模式,设置代码如
    在获取window的时候 添加flag
    Window window = this.getWindow();       
    window.getDecorView().setSystemUiVisibility( View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

猜你喜欢

转载自blog.csdn.net/kongbaidepao/article/details/52165687
今日推荐