API 级别低于 21 的状态栏颜色不变

Posted

技术标签:

【中文标题】API 级别低于 21 的状态栏颜色不变【英文标题】:Status Bar color for API Level below 21 is not changing 【发布时间】:2016-11-23 14:29:43 【问题描述】:

API 级别 21 或以上的状态栏颜色根据我的要求更改,但是如何更改 API 级别低于 21 的颜色。

以下是两个 API 的屏幕截图

API 级别 21:

API 级别 19:

colors.xml

    <?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#FFFFFF</color>
    <item name="b" type="color">#FF33B5E5</item>

    <item name="p" type="color">#FFAA66CC</item>

    <item name="g" type="color">#FF99CC00</item>

    <item name="o" type="color">#FFFFBB33</item>
</resources>

Style.xml

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->

    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBarOverlay">false</item>
    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>

<style name="AppTheme.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="MyCustomTabLayout" parent="Widget.Design.TabLayout">
    <item name="tabSelectedTextColor">@color/colorAccent</item>
</style>

<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

这就是我执行更改时发生的情况:

【问题讨论】:

【参考方案1】:

API 级别 21 以下不支持状态栏着色。但是,您可以使用一些技术来达到 API 级别 19。

将此添加到您的 build.gradle 文件中:

compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'

在你的activity的setContentView方法之前调用这个方法:

private void initStatusBar() 
    Window window = getWindow();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) 
        window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        SystemBarTintManager tintManager = new SystemBarTintManager(this);
        tintManager.setStatusBarTintEnabled(true);
        tintManager.setTintColor(ContextCompat.getColor(this, R.color.primaryDark));
    
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        window.setStatusBarColor(Color.TRANSPARENT);
    



在您的 activity_layout.xml 文件中执行此操作后,将此属性添加到***布局:

android:fitsSystemWindows="true"

这是它在 Lollipop 及更高版本上的显示方式:

这是在 kitkat 上:

【讨论】:

是的,它也发生在我身上。 android:fitsSystemWindows="true" 解决了这个问题。我已经附上了相同的屏幕截图。 我已经添加了命令。仍然无法正常工作。我已经发布了上面的截图以了解更改的效果 如果您使用协调器布局,请将 android:fitsSystemWindows="true" 添加到 AppBarLayout 和工具栏。否则,也尝试添加到工具栏。 还要确保您的活动扩展了 AppCompatActivity。 还是一样的结果【参考方案2】:

因为在 API 21 下,不支持状态栏颜色的变化

【讨论】:

但是如何更改api级别19的颜色。有什么解决办法吗? 是的,你可以做到,但它需要付出代价。你必须手动为状态栏创建自己的视图并计算大小以将其显示在适当的位置。查看此链接@ 987654321@【参考方案3】:

请注意,API 21 下将没有用于状态栏颜色更改的默认类或方法。

如果您仍然想实现您的要求,那么您可以应用布局和样式。

为 api 版本创建 value 文件夹,即 values-v19

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowTranslucentNavigation">false</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowNoTitle">true</item>
</style>

现在需要改变布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    android:orientation="vertical"
    tools:context="moon.testwithold.MainActivity">
    <RelativeLayout
        android:id="@+id/statusbar"
        android:layout_
        android:layout_
        android:layout_alignParentTop="true"
        android:background="@color/colorPrimaryDark" >
    </RelativeLayout>
    <TextView
        android:layout_
        android:layout_
        android:text="Hello World!" />
</LinearLayout>

现在需要更改主类

public class MainActivity extends AppCompatActivity 
    RelativeLayout statusbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        statusbar=(RelativeLayout)findViewById(R.id.statusbar);
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT)
        
            int titleBarHeight= getStatusBarHeight();
            Log.e("TAG"," titleBarHeight "+titleBarHeight);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,titleBarHeight);
            statusbar.setLayoutParams(params);
            statusbar.setVisibility(View.VISIBLE);
        
        else
        
            statusbar.setVisibility(View.GONE);
        
    
    public int getStatusBarHeight() 
        int result = 0;
        int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if (resourceId > 0) 
            result = getResources().getDimensionPixelSize(resourceId);
        
        return result;
    

注意:

如果您想做智能工作,请创建全局活动类(基础活动)并在该类中实现上述方法并在所有活动中扩展该类,以便您可以智能工作并减少编码。

【讨论】:

【参考方案4】:

为低于 21 的 api 级别更改状态栏颜色

public void setStatusBarColor(Activity activity, int RecColor) 
        Window window = activity.getWindow();
        // clear FLAG_TRANSLUCENT_STATUS flag:
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        // add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        // finally change the color
        window.setStatusBarColor(ContextCompat.getColor(activity, RecColor));
    

【讨论】:

警告 API lv 21 是必需的【参考方案5】:

尝试使用

<item name="android:statusBarColor">@color/color_name</item>

你的风格。

【讨论】:

我之前尝试过,但它显示最低 api 级别应该是 21 ..我的项目的最低级别是 API 级别 14 它应该在 api 级别 19 或更高级别上工作。没有办法在低于 19 的 api 级别上更改状态栏颜色。 这是 api 21+

以上是关于API 级别低于 21 的状态栏颜色不变的主要内容,如果未能解决你的问题,请参考以下文章

Android状态栏颜色不变

如何在android中将状态栏背景设置为渐变色或drawable

在 21 android 以下的 api 上更改状态/通知栏颜色?

Android 应用中 v21 的导航栏和状态栏颜色(无主题库)

如何在 Android 中更改状态栏图标的颜色?

Android 沉浸式状态栏