1. 程式人生 > >Android 狀態列的 顏色 的設定上的一些問題 4.4以上 ,字型顏色優化

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;