状态栏字体颜色相关

1.代码改变状态栏字体颜色:

public static void setStatusBarTextColor(Activity activity, boolean isDark) {
        //6.0以上
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            View decorView = activity.getWindow().getDecorView();
            if (decorView != null) {
                int vis = decorView.getSystemUiVisibility();
                if (isDark) {
                    vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
                } else {
                    vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
                }
                decorView.setSystemUiVisibility(vis);
            }
        }
    }

2.修改主题改变状态栏字体颜色:
You can not set the status bar text color by specifying any color explicitly. But you can try below alternative which is Added in API 23. You can use
“android:windowLightStatusBar” attribute in two ways:

“android:windowLightStatusBar” = true, status bar text color will be compatible (grey) when status bar color is light
“android:windowLightStatusBar” = false, status bar text color will be compatible (white) when status bar color is dark

<style name="statusBarStyle" parent="@android:style/Theme.DeviceDefault.Light">
        <item name="android:statusBarColor">@color/status_bar_color</item>
        <item name="android:windowLightStatusBar">false</item>
</style>

You can check above api in below link -
https://developer.android.com/reference/android/R.attr.html#windowLightStatusBar

3.不同的Fragment不同的状态栏颜色
①用代码实现:
不同Fragment调用以下方法以设置不同颜色

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.parseColor(color));
    }

缺点:会闪烁
②(终极解决方案)设置主题:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <style name="AppTheme.Dialer">
        <!-- true: status栏会有一层阴影;false: status栏没有阴影;当该项为true时,则name="android:windowLightStatusBar"设置无效,永远为白色 -->
        <item name="android:windowTranslucentStatus">false</item>
        <!-- 使底部导航栏透明 -->
        <item name="android:windowTranslucentNavigation">false</item>
        <!-- 给status栏设置透明颜色 -->
        <item name="android:statusBarColor">@android:color/transparent</item>
        <!-- true: status栏的图标和文字为黑色;false: sstatus栏的图标和文字为白色 -->
        <item name="android:windowLightStatusBar">true</item>
    </style>

清单文件里activity使用该主题。
根Activity不要设置fitsSystemWindows属性(设置了的话,Fragment就不会覆盖到顶部了),此时各个Fragment是顶到最上面的,如果有需要,你看你要设置相关paddingTop来避免遮盖状态栏。解决底部虚拟导航栏遮盖Fragment的问题:
在Activity的onCreate方法里,添加:

        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

注意,上面这行代码一定要放在setContentView之前
如果发现字体和背景颜色相近,则调用方法1。 效果:完美
参考:
https://stackoverflow.com/questions/28289477/transparent-status-bar-not-working-with-windowtranslucentnavigation-false

③ 主题同②,设置ViewPager不可滑动,Fragment 界面文件根布局设置

android:fitsSystemWindows="true"

然后解决虚拟按钮的方案同②
缺点:仍然繁琐

④:状态栏覆盖了上面占了一定空间,可以通过添加占位view或者其他解决。这里注意的是如果android:windowTranslucentNavigation为true,那么导航栏就会覆盖在应用上面,状态栏同理。
values:

<style name="AppTranslucentStatusBarCover" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/statusBarColor</item>
    <item name="colorPrimaryDark">@color/statusBarColor</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

values-v19:

<style name="AppTranslucentStatusBarCover" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">false</item>
    <item name="colorPrimaryDark">@color/transparent</item>
</style>

values-v21:

 <style name="AppTranslucentStatusBarCover" parent="Theme.AppCompat.Light.NoActionBar">
    <!--设置状态栏为透明-->
    <item name="android:windowTranslucentStatus">true</item>
     <!--导航栏不透明-->
    <item name="android:windowTranslucentNavigation">false</item>
     <!--设置状态栏为透明色-->
    <item name="android:statusBarColor">@android:color/transparent</item>
     <!--导航栏为黑色-->
    <item name="android:navigationBarColor">@android:color/black</item>
</style>

缺点:状态栏是半透明的,不够完美

附:隐藏虚拟按钮:
https://www.cnblogs.com/Sharley/p/7650922.html

猜你喜欢

转载自blog.csdn.net/ithouse/article/details/80332896
今日推荐