创建或更改状态栏颜色的正确方法是什么?

Whats the right approach to create or change color of a status bar?

我在更改状态栏的颜色方面遇到了一个小问题。 我使用的设备告诉我 android 5.1,但是像 windowTranslucentStatusandroid:colorPrimaryDarkandroid:statusBarColor 这样的工作人员根本不起作用(半透明有 20% 的暗透明度) 和其他任何东西都不起作用。

所以它似乎是 android 5.0.

下的东西

所以我尝试了一些应用程序 - 一个确实有效,因为它们在旧应用程序前面制作了自己的状态栏。但第一件事我不会使用不同的应用程序,第二件事这个应用程序不能做我在我的项目中使用的动画通知

所以我在状态栏前面制作了一个带有我的颜色的按钮,但现在我需要在那里添加所有图标。 (我只需要wifi,蓝牙,电池,时间。)就是这样,但我发现很难。

所以现在我有点卡住了,有没有人知道如何更改颜色或如何以某种方式复制通知图标?我不需要滑动通知栏我只需要它被看到。

您可以在 activity 或应用程序主题中的 androidMenifest.xml 中设置它,例如

<activity
     android:theme="@style/activityTheme"
     android:name=".MyActivity"
     android:screenOrientation="portrait" />

style.xml

<style name="activityTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

colorPrimaryDark 是 activity

的状态栏颜色

如果您想以编程方式更改它,您可以使用下面的代码

对于Activity

Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     window.statusBarColor = ContextCompat.getColor(this, R.color.YOUR_COLOR)
}

Java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.COLOR));
}

对于片段

Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     activity.window.statusBarColor = ContextCompat.getColor(this, R.color.YOUR_COLOR)
}

Java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
     getActivity().getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.COLOR));
}

清单

<application android:name="com.smartpos.pocket.app.PocketApplication" android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:allowBackup="true" android:theme="@style/AppTheme">
    <activity android:name="com.smartpos.pocket.activity.impl.StartUpActivity" android:theme="@style/AppTheme">

样式(我在 api 17 有项目)

<style name="AppTheme" parent="AppCompat">
</style>

样式 v21

<style name="AppCompat" parent="Theme.AppCompat">
        <item name="colorAccent">@color/color_red_real</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="colorPrimary">@color/color_red_real</item>
        <item name="colorPrimaryDark">@color/color_red_real</item>
</style>

状态栏不会改变任何东西我的设备是一个 laier 并且没有 android 5.1 或者我不知道...

hmmm 可以更改...mabie 因为 Theme.AppCompat 是深色的而 Theme.AppCompat.Light.DarkActionBar 是浅色的

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/color_red_real</item>
    <item name="colorPrimaryDark">@color/color_red_real</item>
    <item name="colorAccent">@color/color_red_real</item>
</style>[![enter image description here][1]][1]

<style name="AppTheme" parent="Theme.AppCompat">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/color_red_real</item>
    <item name="colorPrimaryDark">@color/color_red_real</item>
    <item name="colorAccent">@color/color_red_real</item>
</style>

所以最后一件事是它确实有效这是唯一一个不会留下状态栏阴影的代码...不知道为什么但是是的这对我来说是解决方案...我将我的背景设置为红色。 .. 在所有屏幕(布局)上,我在所有布局的后面添加从边到边的布局...所以我的背景现在是这个布局...真正的背景仅用于状态栏...

像 TranslucentStatus 这样的解决方案和我的颜色的小布局确实在状态栏后面留下了阴影,所以我永远无法准确地获得我需要的颜色......而像 statusbarcolor 或 primarydarkcolor 这样的解决方案以编程方式或在样式上从未奏效......所以如果你有这个问题,你可以做这个丑陋的解决方案......但它确实有效......

非常感谢@Muhammad Muzammil Sharif 没有他我永远不会达到这个地步...(我公司的 3 个人整周都试图做到这一点)

这是最终版本...现在我想隐藏一些系统通知...但我不认为这是可能的...再次感谢大家

所以在你所有的 java activity 中你需要这个:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }

并且在你的styles.xml你需要设置背景颜色(这个颜色将是你的状态栏颜色):

<style name="AppCompat" parent="Theme.AppCompat">
    <item name="android:colorBackground">@color/YOUR_STATUS_BAR_COLOR</item>
</style>

并且在所有布局中,您需要添加将作为背景的布局:

<LinearLayout
    android:background="@color/YOUR_BACKGROUND_COLOR"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom"
    />

当然,如果您想使用@color/just 名称...您需要将其设置为 colors.xml:

<color name="YOUR_STATUS_BAR_COLOR">#cf031c</color>
<color name="YOUR_BACKGROUND_COLOR">#383838</color>