AppCompat ActionBarActivityでステータスバーの色を変更する


145

アクティビティの1つで、を使用してツールバーの色を変更しましたPalette。しかし、5.0デバイスでは、この色を使用ActionBarActivityするstatus barことcolorPrimaryDarkが私の活動テーマの私の色なので、2つの非常に異なる色があり、見栄えがよくありません。

5.0 では使用できますWindow.setStatusBarColor()が、これActionBarActivityはありません。

私の質問は5.0ですが、ステータスバーの色をどのように変更できActionBarActivityますか?


SystemBarTint libを使用しようとしましたか?github.com/jgilfelt/SystemBarTint
Nikola

回答:


419

問題が理解できたかどうかわかりません。

プログラムでステータスバーの色を変更したい場合(デバイスに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、問題なく動作しました。


注:スタイルファイルで既にFLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSフラグがvalues-v21設定されている場合は、プログラムでフラグを設定する必要はありません。

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

1
ああ、私は使用していgetWindow()
ませんでした

これは、古いAndroidでコードLOLLIPOPが見つからない場合にクラッシュします。使用に最適> = 21
コード511788465541441 2014年

12
@ code578841441実際には、それは起こらないはずです。定数はコンパイル時にインライン化されます。
マティアッシュ2014年

4
@ code578841441:古いSDKでコンパイルしているためです。古いAPIバージョンの制約(要素の属性など)がある場合でも、常に最新のAndroid SDKでコンパイルするように努める必要があります。minSdkVersiontargetSdkVersion<uses-sdk ...>
dbm 2014年

3
また、getWindow()。addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);を呼び出す必要がありました。機能させるには
Philipp E.

61

ステータスバーの色を変更するには、さまざまな方法があります。

1)styles.xmlを使用します。android:statusBarColor属性を使用すると、簡単ですが静的な方法でこれを行うことができます。

注:この属性は、マテリアルテーマでも使用できます。

<?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);のように見えます。必要はありません-しかし、これは私のために働きました
bkurzius

プログラムバージョンは機能するが、スタイルバージョンは機能しない理由はありますか?
Andrew、

私の場合、アクティビティのスタイルにはflahのtranslucent_statusが設定されているため、window.clearFlagsコマンドがないと機能しませんでした。これをありがとう!
BMacedo 16

ああすごい!これは受け入れられるべき回答です。clearFlags私の問題を修正してください
fanjavaid

9

ステータスバーの色は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から


1
古いOSバージョンがステータスバーを変更する機能を提供しない場合、AppCompatに実装されない可能性があります。
TheIT

2
<attr name = "colorPrimaryDark" format = "color" /> <!-ブランディングの原色の濃い色。デフォルトでは、これはステータスバー(statusBarColorを介して)およびナビゲーションバー(navigationBarColorを介して)に適用される色です。->
Soheil Setayeshi 2015年

3

これを試してください、私はこれを使用しました、そしてそれはv21で非常にうまく機能します。

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

1

上記の回答に感謝し、それらの助けを借りて、xamarin.android MVVMCrossアプリケーションの特定のR&Dの後、以下が機能しました

メソッド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を紹介してもらいました。


1

[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
    }
}

0

申請中

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

Theme.AppCompat.Light.DarkActionBarうまくいきませんでした。トリックは何でしたかcolorPrimaryDark、いつものように android:colorPrimarystyles.xmlで与えます

<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);
                }

コードでステータスバーの色を設定する必要はありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.