【问题标题】:Status Bar color for API Level below 21 is not changingAPI 级别低于 21 的状态栏颜色不变
【发布时间】: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" />

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

【问题讨论】:

    标签: android xml android-theme android-styles android-statusbar


    【解决方案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_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="moon.testwithold.MainActivity">
        <RelativeLayout
            android:id="@+id/statusbar"
            android:layout_width="match_parent"
            android:layout_height="25dp"
            android:layout_alignParentTop="true"
            android:background="@color/colorPrimaryDark" >
        </RelativeLayout>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            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+
      猜你喜欢
      • 2016-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2015-05-28
      相关资源
      最近更新 更多