改变Android状态栏字体颜色和实现沉浸式状态栏

目前已知的改变Android状态栏字体颜色的方法只有3种情况下可以实现,分别是手机是MIUI系统、魅族手机以及Android6.0。改变颜色方法分别如下:

* 改变小米的状态栏字体颜色为黑色, 要求MIUI6以上

lightStatusBar为真时表示黑色字体

*/

private void processMIUI(booleanlightStatusBar) {

Class<? extends Window> clazz = window.getClass();

try {

int darkModeFlag;

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(window, lightStatusBar? darkModeFlag : 0, darkModeFlag);

} catch (Exception ignored) {



}

}

/**

* 改变魅族的状态栏字体为黑色,要求FlyMe4以上

*/

private void processFlyMe(booleanisLightStatusBar) {

WindowManager.LayoutParams lp= window.getAttributes();

try {

Class<?> instance = Class.forName("android.view.WindowManager$LayoutParams");

int value = instance.getDeclaredField("MEIZU_FLAG_DARK_STATUS_BAR_ICON").getInt(lp);

Field field = instance.getDeclaredField("meizuFlags");

field.setAccessible(true);

int origin = field.getInt(lp);

if (isLightStatusBar) {

field.set(lp, origin | value);

} else {

field.set(lp, (~value)& origin);

}

} catch (Exception ignored) {

//

}

}

/**

* 处理Lollipop以上

* Lollipop可以设置为沉浸,不能设置字体颜色(所以白色背景会很丑)

* M(API23)可以设定

*/

@TargetApi(Build.VERSION_CODES.LOLLIPOP)private void processLollipopAbove() {

if (Build.VERSION.SDK_INT< Build.VERSION_CODES.LOLLIPOP) {

return;

}

int flag = window.getDecorView().getSystemUiVisibility();

if (lightStatusBar) {

/**

* see {@link <a href="https://developer.android.com/reference/android/R.attr.html#windowLightStatusBar"></a>}

*/

flag |= (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS

| View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

}

if (transparentStatusBar) {

//改变字体颜色

flag |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;

}

window.getDecorView().setSystemUiVisibility(flag);

window.setStatusBarColor(Color.TRANSPARENT);

}



如何实现状态栏沉浸式可以通过sysembartint这个库,通过initwindow方法在setcontent之后执行可以实现沉浸式效果:

@TargetApi(19)
    private void initWindow(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            SystemBarTintManager tintManager = new SystemBarTintManager(this);
            tintManager.setStatusBarTintColor(getResources().getColor(R.color.white));
            tintManager.setStatusBarTintEnabled(true);
            ViewGroup contentView = (ViewGroup) findViewById(R.id.rl_tittle);
            contentView.setPadding(0,getStatusBarHeight<span style="font-size: 16pt; font-family: Consolas;">(this),0,0);</span>
            processMIUI(true);
        }
    }
public static int getStatusBarHeight(Context context){

   Class<?> c = null;
   Object obj = null;
   Field field = null;

   String bar = "status_bar_height";
   int height = 0;
   try {
      c = Class.forName("com.android.internal.R$dimen");
      obj = c.newInstance();
      field = c.getField(bar);
      int x = Integer.parseInt(field.get(obj).toString());
      height = context.getResources().getDimensionPixelSize(x);
   } catch(Exception e1) {
      KasLog.e(TAG, "get bar height fail :"+e1.toString());
      height = 0;
   }
   KasLog.d(TAG, bar + "height= " + height);
   height = Math.max(0, height);
   return height;
}

如果你发现了其他能设置状态栏字体颜色的方法请通过留言板告诉我,谢谢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值