Android 状态栏的 颜色 的设置上的一些问题 4.4以上 ,字体颜色优化

之前一致设置的是状态栏 透明的这样子, 但是在不同版本的机型上可能显示的效果会有偏差,这也是google做了些修改,5.0支持设置颜色, 4.0只支持透明而已
想要4.4 - 6.0风格完全保持一致 就设置状态栏的颜色, 如果想要设置 状态栏透明的话,中间有些的状态栏上面是 有层灰色的(颜色会深一些, 这也是google做了修改,希望能更分辨请状态栏这样子)

一、状态栏设置颜色(5.0)
1. 在代码中设置的代码
5.0中提供了setStatusBarColor 的方法

 //参数设置 activity 颜色
public static void setWindowStatusBarColor(Activity activity, int colorResId) {

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {             
//得到窗口
Window window = activity.getWindow();                
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
//设置状态栏的颜色              window.setStatusBarColor(activity.getResources().getColor(colorResId));
//设置底部的颜色
window.setNavigationBarColor(activity.getResources().getColor(colorResId));
}

public static void setWindowStatusBarColor(Dialog dialog, int colorResId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = dialog.getWindow();      
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);          
window.setStatusBarColor(dialog.getContext().getResources().getColor(colorResId));
window.setNavigationBarColor(activity.getResources().getColor(colorResId));
  }
 }
  1. 带style中设置的代码
    属性的对应关系(图是从网上拿的)
    这里写图片描述
 <itemname="colorPrimary">@android:color/holo_blue_bright</item>
 <itemname="colorPrimaryDark">@android:color/holo_blue_bright</item>

PS: 如果继承 AppCompatActivity

public class MainActivity extends AppCompatActivity

直接

StatusBarCompat.compat(this, getResources().getColor(R.color.XXX));

二、状态栏的透明

windowTranslucentStatus (API level 19)

Flag indicating whether this window requests a translucent status bar.
大意就是说状态栏是否半透明,如果是true的话,你会发现你的actionbar、Toolbar陷入到状态栏里面了,所以为了预留空间,需要下面的属性

android:fitsSystemWindows

Boolean internal attribute to adjust view layout based on system windows such as the status bar. If true, adjusts the padding of this view to leave space for the system windows. Will only take effect if this view is in a non-embedded activity.
是否基于系统界面(比如状态栏)调整View的布局,如果是true的话,它就会给系统界面预留一部分空间

这个很重要咯:
状态栏会保持与设置fitsSystemWindow属性的控件的背景颜色一致
效果会有点点偏差,后面的4.4 和5.0以上不一样的,5.0以上状态栏颜色会偏重

1.代码中设置(设置透明)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    Window window = getWindow();
    // Translucent status bar
    window.setFlags(
        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    // Translucent navigation bar
    window.setFlags(
        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

在layout 的父布局中 加入属性

android:clipToPadding="true"// 定义布局间是否有间距
android:fitsSystemWindows="true
  1. 如果是设置style文件的话。 是这样设置的
<style name="AppTheme" parent="AppBaseTheme">
    <!-- Status Bar -->
    <item name="android:windowTranslucentStatus">true</item>
    <!-- Navigation Bar -->
    <item name="android:windowTranslucentNavigation">true</item>
</style>

其他的theme 透明风格

android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar.TransucentDecor"
android:theme="@android:style/Theme.Holo.Light.NoActionBar.TranslucentDeor"
//new SystemBarTintManager(this).setStatusBarTintEnabled(true);

三、最最后 6.0 可以设置状态栏字体
Android 6.0开始,谷歌官方提供了支持,在style属性中配置android:windowLightStatusBar
即可, 设置为true时,当statusbar的背景颜色为淡色时,statusbar的文字颜色会变成灰色,为false时同理。

 <item name="android:statusBarColor">@color/status_bar_color</item>
 <item name="android:windowLightStatusBar">false</item>
</style>

这个是剩下网上的解决 miui的方案
为小米官方提供的解决方案,主要为MIUI内置了可以修改状态栏的模式,支持Dark和Light两种模式。

public static boolean setMiuiStatusBarDarkMode(Activity activity, boolean darkmode) {
    Class<? extends Window> clazz = activity.getWindow().getClass();
    try {
        int darkModeFlag = 0;
        Class<?> layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams");
        Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE");
        darkModeFlag = field.getInt(layoutParams);
        Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class);
        extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

修改Flyme

public static boolean setMeizuStatusBarDarkIcon(Activity activity, boolean dark) {
    boolean result = false;
    if (activity != null) {
        try {
            WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
            Field darkFlag = WindowManager.LayoutParams.class
                    .getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON");
            Field meizuFlags = WindowManager.LayoutParams.class
                    .getDeclaredField("meizuFlags");
            darkFlag.setAccessible(true);
            meizuFlags.setAccessible(true);
            int bit = darkFlag.getInt(null);
            int value = meizuFlags.getInt(lp);
            if (dark) {
                value |= bit;
            } else {
                value &= ~bit;
            }
            meizuFlags.setInt(lp, value);
            activity.getWindow().setAttributes(lp);
            result = true;
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空白的泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值