AppCompatActivity 状态栏始终显示为黑色

Status bar always appears black with AppCompatActivity

我的状态栏总是显示黑色。我尝试了多次修复,但没有任何效果......我不敢相信这么简单的事情竟然如此复杂

这是我的 Style.xml:

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

<style name="BaseTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/cobalt</item>
    <item name="colorPrimaryDark">@color/cobalt_dark</item>
    <item name="colorControlHighlight">@color/cobalt_light</item>
    
    <item name="colorAccent">@color/cobalt_light</item>
</style>

这是我的 v21/style.xml:

<style name="AppTheme" parent="BaseTheme">
    <item name="android:colorControlHighlight">@color/cobalt_light</item>
    
    <item name="android:statusBarColor">@color/cobalt_light</item>
</style>

这是我的 Activity:

public class ActivityLogin extends AppCompatActivity {
 //...
}

我的清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.plante.android.cobalt"
    android:versionName="7">

    <uses-sdk
        android:minSdkVersion="17"
        android:targetSdkVersion="21" />

    <application
        android:name=".CobaltApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme”>
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <activity
            android:windowSoftInputMode="adjustResize"
            android:name=".activityv2.ActivityLogin"
            android:label="@string/app_name"
            android:screenOrientation="portrait">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".activityv2.ActivityHome"
            android:label="Home"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.nfc.action.TECH_DISCOVERED" />
            </intent-filter>
            <meta-data
                android:name="android.nfc.action.TECH_DISCOVERED"
                android:resource="@xml/nfc_tag_filter" />
        </activity>
        <activity
            android:name=".activityv2.ActivitySplash"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:screenOrientation="portrait"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

尝试使用此属性更新您的 v21/style:

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

更新: 在与作者讨论后,我们决定使用 targetSdkVersion=18。我们可以从 \sdk\extras\android\support\v7\appcompat\res\values\attrs.xml

中注意到
<!-- 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" />

由于 statusBarColor 属性 添加在 API 级别 21 中,因此没有记录更改状态栏的方法棒棒糖前的颜色。

您应该将您的样式 "BaseTheme" 重命名为 "AppTheme.Base" 以便它重载基本应用程序主题。

或者在清单文件的标签中添加参数:

android:theme="@style/BaseTheme"

如果解决方案被证明是虚幻的,您始终可以通过编程设置颜色。

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

好的,问题来了:

defaultConfig {
    applicationId "com.plante.android.cobalt"
    minSdkVersion 17
    targetSdkVersion 18
    versionCode 7
    multiDexEnabled false
    versionName "7"
}

我应该设置 api 21 及以上才能正常工作...