频道栏目
首页 > 资讯 > Android > 正文

Android 沉浸式状态栏的苦逼之旅

17-08-14        来源:[db:作者]  
收藏   我要投稿

Android 沉浸式状态栏的苦逼之旅,先说一下基本设定
1、values-v21

2、values-v19

状况一

开发完程序用同事的小米手机测试(⊙o⊙),突然发现白色状态栏,白色字体(⊙﹏⊙)b,这TM的能看吗,于是就有了下面的代码

//处理状态栏,小米
public static void setStatusBarDarkMode(boolean darkmode, Activity activity) {
    Class 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);
        } catch (Exception e) {
            e.printStackTrace();
        }
}

然后BaseActivity中的onCreate中setStatusBarDarkMode(true, this);一下,好了字体变黑了,既然字体可变了,那么就该改状态栏,先上一张图
这里写图片描述
这是Android5.0的效果图,所以我们经常看到刚创建的工程里面有这样的代码

恩,我们要修改statusBarColor,然而4.4-5.0没法直接改状态栏颜色,折中办法
1、状态栏变半透明,没错就是上面values-v19的设置

2、在状态栏上加一个布局

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT <                     Build.VERSION_CODES.LOLLIPOP)
{
    int color = COLOR_DEFAULT;
    ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
    if (statusColor != INVALID_VAL)
    {
        color = statusColor;
    }
    View statusBarView = new View(activity);
    ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
    //可以是资源,我这是渐变的,像QQ一样
    statusBarView.setBackgroundResource(R.drawable.bg_title_gradient);
    //可以是具体的颜色,反正View能设置的都想
    //statusBarView.setBackgroundColor(color);
    contentView.addView(statusBarView, lp);
}

获取状态栏的高度

public static int getStatusBarHeight(Context context)
{
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0)
    {
       result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

以上就是4.4-5.0状态栏的设置方法

5.0以后的

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
{
    if (statusColor != INVALID_VAL)
    {
       //透明状态栏,也就是不能要values-v19中主题的方法
       activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
       //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜
       activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
       activity.getWindow().setStatusBarColor(statusColor);   
    }      
}

好了,在BaseActivity里面onCreate使用,比如StatusBarCompat.compat(this, R.color.blue);

状况二

打开我自己的红米手机(不好意思用同事的),一脸闷逼之状态栏没变色,然后看一下系统版本5.0的,没问题啊,然后我将百度翻烂了没找到原因,而在另一台华为4.4上都是可以的。最后还是在写布局的时候忘加入android:fitsSystemWindows=”true”发现状态栏根本不是透明的,就是白的…

状况三

我不想用自己的手机测试了,就创建了个模拟器(Android7.0),什么,状态栏又没变色%>_<%,经过测试,状态栏是半透明的,其他软件状态栏是变色的,好吧我发大招了,我的终极代码

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static void compat(Activity activity, int statusColor)
{
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        if (statusColor != INVALID_VAL)
        {
            int color = COLOR_DEFAULT;
            ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
            if (statusColor != INVALID_VAL)
            {
                color = statusColor;
            }
            View statusBarView = new View(activity);
            ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
            statusBarView.setBackgroundResource(R.drawable.bg_title_gradient);
            contentView.addView(statusBarView, lp);
        }
     }

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
     {
         int color = COLOR_DEFAULT;
         ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content);
         if (statusColor != INVALID_VAL)
         {
             color = statusColor;
         }
         View statusBarView = new View(activity);
         ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
         statusBarView.setBackgroundResource(R.drawable.bg_title_gradient);
         contentView.addView(statusBarView, lp);
     }

}

好吧上下一样,由于公司可测试手机不多(他们都用苹果),也没找到集体原因,以上方法应该可以应对4.4以上所有方法

相关TAG标签
上一篇:UI 一一 UITableView多组和单组数据展示案例
下一篇:勘探-微信小程序
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站