【问题标题】:Change status bar color with AppCompat ActionBarActivity使用 AppCompat ActionBarActivity 更改状态栏颜色
【发布时间】:2014-12-29 09:16:48
【问题描述】:

在我的一项活动中,我使用Palette 更改了工具栏颜色。但是在使用 ActionBarActivity 的 5.0 设备上,status bar 颜色是我的活动主题中colorPrimaryDark 的颜色,所以我有两种非常不同的颜色,看起来不太好。

我意识到在 5.0 中你可以使用 Window.setStatusBarColor()ActionBarActivity 没有这个。

所以我的问题是在 5.0 中如何使用ActionBarActivity 更改状态栏颜色?

【问题讨论】:

标签: android android-5.0-lollipop android-toolbar


【解决方案1】:

我不确定我是否理解问题。

如果您想以编程方式更改状态栏颜色(如果设备装有 Android 5.0),那么您可以使用Window.setStatusBarColor()。活动是从Activity 还是ActionBarActivity 派生的,应该没有区别。

试着做:

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

刚刚使用ActionBarActivity 进行了测试,它工作正常。


注意:如果您的 values-v21 样式文件已经设置了 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS 标志,则无需以编程方式设置它,通过:

    <item name="android:windowDrawsSystemBarBackgrounds">true</item>

【讨论】:

  • 啊好吧我没用getWindow()
  • 这会在旧机器人中找不到代码 LOLLIPOP 时崩溃。最好使用 >=21
  • @code578841441 实际上,这不应该发生。编译时内联常量。
  • @code578841441:那是因为您使用的是旧版 SDK 进行编译。即使您有较旧的 API 版本限制(即 &lt;uses-sdk ...&gt; 元素上的 minSdkVersion 和/或 targetSdkVersion 属性),您也应该始终努力编译最新的 Android SDK。
  • 我还必须调用 getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAW_SYSTEM_BAR_BACKGROUNDS);让它发挥作用
【解决方案2】:

改变状态栏颜色的方法有很多种。

1) 使用styles.xml。您可以使用 android:statusBarColor 属性以简单但静态的方式执行此操作。

注意:您也可以将此属性与 Material 主题一起使用。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

2) 您可以使用 Window 类中的 setStatusBarColor(int) 方法动态完成它。但请记住,此方法仅适用于 API 21 或更高版本。所以一定要检查一下,否则你的应用肯定会在较低的设备上崩溃。

这是此方法的一个工作示例。

if (Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(getResources().getColor(R.color.primaryDark));
}

其中 primaryDark 是我在应用程序中使用的原色的 700 色调。您可以在 colors.xml 文件中定义此颜色。

请尝试一下,如果您有任何问题,请告诉我。希望对您有所帮助。

【讨论】:

  • 看起来像 window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);不需要 - 但这个对我有用
  • 任何想法为什么程序化版本可以工作但样式版本不能?
  • 在我的例子中,活动的样式设置了flah translucent_status,所以没有window.clearFlags 命令它不起作用。所以谢谢你!
  • 哇哦!这应该是被接受的答案,添加clearFlags修复我的问题
【解决方案3】:

我认为状态栏颜色尚未在 AppCompat 中实现。这些是可用的属性:

    <!-- ============= -->
    <!-- Color palette -->
    <!-- ============= -->

    <!-- The primary branding color for the app. By default, this is the color applied to the
         action bar background. -->
    <attr name="colorPrimary" format="color" />

    <!-- Dark variant of the primary branding color. By default, this is the color applied to
         the status bar (via statusBarColor) and navigation bar (via navigationBarColor). -->
    <attr name="colorPrimaryDark" format="color" />

    <!-- Bright complement to the primary branding color. By default, this is the color applied
         to framework controls (via colorControlActivated). -->
    <attr name="colorAccent" format="color" />

    <!-- The color applied to framework controls in their normal state. -->
    <attr name="colorControlNormal" format="color" />

    <!-- The color applied to framework controls in their activated (ex. checked) state. -->
    <attr name="colorControlActivated" format="color" />

    <!-- The color applied to framework control highlights (ex. ripples, list selectors). -->
    <attr name="colorControlHighlight" format="color" />

    <!-- The color applied to framework buttons in their normal state. -->
    <attr name="colorButtonNormal" format="color" />

    <!-- The color applied to framework switch thumbs in their normal state. -->
    <attr name="colorSwitchThumbNormal" format="color" />

(来自 \sdk\extras\android\support\v7\appcompat\res\values\attrs.xml

【讨论】:

  • 如果旧的操作系统版本不提供任何修改状态栏的能力,它可能永远不会在 AppCompat 中实现。
【解决方案4】:

试试这个, 我用过这个,它在 v21 上效果很好。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimaryDark">@color/blue</item>
</style>

【讨论】:

    【解决方案5】:

    [Kotlin 版本] 我创建了这个扩展,它还检查所需颜色是否有足够的对比度来隐藏系统 UI,如电池状态图标、时钟等,因此我们根据此将系统 UI 设置为白色或黑色。

    fun Activity.coloredStatusBarMode(@ColorInt color: Int = Color.WHITE, lightSystemUI: Boolean? = null) {
        var flags: Int = window.decorView.systemUiVisibility // get current flags
        var systemLightUIFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
        var setSystemUILight = lightSystemUI
    
        if (setSystemUILight == null) {
            // Automatically check if the desired status bar is dark or light
            setSystemUILight = ColorUtils.calculateLuminance(color) < 0.5
        }
    
        flags = if (setSystemUILight) {
            // Set System UI Light (Battery Status Icon, Clock, etc)
            removeFlag(flags, systemLightUIFlag)
        } else {
            // Set System UI Dark (Battery Status Icon, Clock, etc)
            addFlag(flags, systemLightUIFlag)
        }
    
        window.decorView.systemUiVisibility = flags
        window.statusBarColor = color
    }
    
    private fun containsFlag(flags: Int, flagToCheck: Int) = (flags and flagToCheck) != 0
    
    private fun addFlag(flags: Int, flagToAdd: Int): Int {
        return if (!containsFlag(flags, flagToAdd)) {
            flags or flagToAdd
        } else {
            flags
        }
    }
    
    private fun removeFlag(flags: Int, flagToRemove: Int): Int {
        return if (containsFlag(flags, flagToRemove)) {
            flags and flagToRemove.inv()
        } else {
            flags
        }
    }
    

    【讨论】:

      【解决方案6】:

      只需将此函数粘贴到您的 Utils 类中即可保存所有其他常用函数。

      fun Activity.changeStatusBarColor(color: Int, isLight: Boolean) {
          window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
          window.statusBarColor = color
      
          WindowInsetsControllerCompat(window, window.decorView).isAppearanceLightStatusBars = isLight
      }
       
      

      并像这样在任何地方使用它:

      changeStatusBarColor(
              ContextCompat.getColor(
                  context,
                  R.color.black
              ), false
          )
      

      请注意,这里我还分别管理了深色和浅色状态栏颜色,以管理状态栏的图标和文本颜色。

      【讨论】:

        【解决方案7】:

        感谢以上答案,在这些人的帮助下,经过对 xamarin.android MVVMCross 应用程序的某些研发,以下工作

        为方法 OnCreate 中的活动指定的标志

        protected override void OnCreate(Bundle bundle)
            {
                base.OnCreate(bundle);
                this.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
            }
        

        对于每个 MvxActivity,主题如下所述

         [Activity(
            LaunchMode = LaunchMode.SingleTop,
            ScreenOrientation = ScreenOrientation.Portrait,
            Theme = "@style/Theme.Splash",
            Name = "MyView"
            )]
        

        我的 SplashStyle.xml 如下所示

        <?xml version="1.0" encoding="utf-8"?>
        <resources> 
            <style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
                  <item name="android:statusBarColor">@color/app_red</item>
                  <item name="android:colorPrimaryDark">@color/app_red</item>
            </style>
         </resources>
        

        我提到了 V7 appcompact。

        【讨论】:

          【解决方案8】:

          申请

              <item name="android:statusBarColor">@color/color_primary_dark</item>
          <item name="android:windowDrawsSystemBarBackgrounds">true</item>
          

          Theme.AppCompat.Light.DarkActionBar 对我不起作用。诀窍是,在styles.xml 中像往常一样提供colorPrimaryDarkandroid:colorPrimary

          <item name="android:colorAccent">@color/color_primary</item>
          <item name="android:colorPrimary">@color/color_primary</item>
          <item name="android:colorPrimaryDark">@color/color_primary_dark</item>
          

          在设置中

          if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                          {
                              Window window = this.Window;
                              Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
                          }
          

          不必在代码中设置状态栏颜色。

          【讨论】:

            【解决方案9】:

            如果您在 Android 中使用 Kotliln,这可以实现:

            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.statusBarColor = Color.WHITE
            

            【讨论】:

              【解决方案10】:

              OnCreate()ActivityFragment 中添加此kotlin 代码:

                if (Build.VERSION.SDK_INT >= 21) {
                          val window: Window = requireActivity().window
                          window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
                          window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
                          window.statusBarColor = resources.getColor(R.color.very_light_pink)
                      }
              

              【讨论】:

                猜你喜欢
                • 2015-01-02
                • 1970-01-01
                • 2016-10-25
                • 2023-03-26
                • 2015-05-09
                • 2015-09-26
                • 2016-11-04
                • 2017-02-02
                • 2021-11-05
                相关资源
                最近更新 更多