Androidでステータスバーの色を変更するにはどうすればよいですか?


427

まず第一にそれはAndroidステータスバーの背景色を変更する方法のように重複ではありません

ステータスバーの色を変更するにはどうすればよいですか?

ステータスバーの色をナビゲーションバーの色と同じにしたい

ここに画像の説明を入力してください


2
キットカット@MarkBuikemaの後でのみ可能
codercat '

4
Nielsが示唆するように、v21以降はTHEME ATTRIBUTEと呼ばれていandroid:statusBarColorます。単純にに追加できますvalues-v21/styles.xml
Levite 2016年

@MarkBuikemaルートアクセスに関連するのはどうですか!
steve moretz

回答:


625

Android 5.0 Lollipop colorPrimaryDarkは、テーマの値に基づいてステータスバーを自動的に色付けするマテリアルデザインテーマを導入しました。

これは、バージョン21以降のライブラリsupport-v7-appcompatのおかげで、デバイスのプレロリポップでサポートされています。ChrisBanesによるサポートappcompat v21に関するブログ投稿

ここに画像の説明を入力してください

マテリアルテーマの詳細については、Androidデベロッパーの公式ウェブサイトをご覧ください。


29
何らかの理由でcolorPrimaryDark属性が機能しません。エミュレータv21で試した
逸脱した

3
レイアウトプレビューではなく、エミュレータでの変更を確認する必要があります[そこには表示されません]
Mightian

6
colorPrimaryDarkは、API 18エミュレータでも機能しません。appcompatに関するリンク先の記事から:「古いプラットフォームでは、AppCompatは可能な限り色のテーマをエミュレートします。現時点では、これはアクションバーと一部のウィジェットの色に限定されています。」
Adam Johns、

12
ステータスバーのフォントの色を変更するのはどうですか?ドキュメントはそれについて何も言わない。
Scott Biggs

同じようにしてみました。ほとんどすべてのデバイスで問題なく動作しますが、samsung galaxy s4でOS 5.0.1を実行しています。この電話のステータスバーの色は黒です。そして、別のアクティビティに移動して前のアクティビティに再び戻ると、ステータスバーの色がアプリのテーマの色に変わります。これが発生している理由
Hitesh Kamani 2016

364

更新:

ロリポップ:

public abstract void setStatusBarColor (int color)

APIレベル21で追加

Android Lollipopでは、アプリのステータスバーの色を変更して、より没入型のユーザーエクスペリエンスを実現し、Googleのと調和させることができますMaterial Design Guidelines

window.setStatusBarColor導入された新しいメソッドを使用して、ステータスバーの色を変更する方法を次に示しますAPI level 21

ステータスバーの色を変更するには、ウィンドウに2つの追加フラグを設定する必要があります。FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSフラグを追加してクリアする必要がありますFLAG_TRANSLUCENT_STATUS

作業コード:

import android.view.Window;

...

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,R.color.my_statusbar_color));

公式開発者リファレンス:setStatusBarColor(int)

例:material-design-everywhere

Chris Banesブログ-appcompat v21:Lollipop以前のデバイスのマテリアルデザイン!

ここに画像の説明を入力してください

transitionNameビューの背景には次のようになりますandroid:status:background


2
後方互換性のための解決策はありますか?
Adam Hurwitz 2017

ニールスでの回答で述べたように:あなたはまた、設定することにより、テーマ/スタイルを経由して、ステータスバーの色を設定することができandroid:statusBarColor、あなたにvalues-v21/styles.xmlあたり、ファイルandroiddocs.com/training/material/theme.htmlとても似<item name="android:statusBarColor">@color/primary_color</item>
JL西

4
ステータスバーの色を白に変更できますが、バッテリーのような通知アイコンが表示されません。これを解決するにはどうすればよいですか?
MNFS

1
あなたはちょうど私..どのように役立ったかくらいは考えている
アビシェークDhyani

222

これをvalues-v21 / styles.xmlに置き、Lollipopでこれを有効にします:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:statusBarColor">@color/color_primary</item>
    </style>
</resources>

34
これには最小API 21が必要です
Roman

49
これがおそらく彼がvalues-v21 / styles.xmlに入れることを提案した理由です;-)これまでのところ最も正確な答えのようです!!
Levite

しかし、これでも警告が表示されます!!?
Nihal Sharma

compatの機能は何ですか?ステータスバー
blackHawk 2018年

targeApi単一のスタイルファイルを維持する場合は、属性を追加できます。参照のために私の答えを読んでくださいstackoverflow.com/a/48565459/4291272
Faisal Shaikh

50

これは、ライブラリなしでこれを行う非常に簡単な方法です。OSバージョンがサポートされていない場合(キットカットの下)、何も起こりませんでした。私はこの手順を実行します:

  1. 私のxmlで私はこのビューの一番上に追加しました:
<View
        android:id="@+id/statusBarBackground"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

それから私はこの方法を作りました:

 public void setStatusBarColor(View statusBar,int color){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           Window w = getWindow();
           w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //status bar height
           int actionBarHeight = getActionBarHeight();
           int statusBarHeight = getStatusBarHeight();
           //action bar height
           statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
           statusBar.setBackgroundColor(color);
     }
}

また、アクションバーとステータスバーの高さを取得するには、これらの両方のメソッドが必要です。

public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
    {
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

次に必要なのは、ステータスバーの色を設定する次の行だけです。

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

1
ビュー要素はどこに置くべきですか?メインレイアウトの上に配置する必要がありますか?
EmilReñaEnriquez

はい。あなたのxmlで。その上部に。
itzhar 2015年

注意:android> = 19 APIでのみ機能します。私の場合、16
Anton Kizema

setStatusBarColor(findViewById(android.R.id.statusBarBackground)、getResources()。getColor(android.R.color.white));
AndroidLad 2015

34

@Nielsが言ったように、values-v21 / styles.xmlに配置する必要があります。

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

ただしtools:targetApi="lollipop"、次のように単一のstyles.xmlが必要な場合は追加します。

<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>

3
「targetApi」をたくさんありがとう。テーマを複数のファイルに広げるのは好きではありません。:)
神経叢

31

まあ、Izharソリューションは問題ありませんでしたが、個人的には、次のようなコードは避けようとしています。

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do what you need for this SDK
};

また、コードを複製することも好きではありません。あなたの答えでは、すべてのアクティビティにそのようなコード行を追加する必要があります:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

したがって、私はIzharソリューションを採用し、XMLを使用して同じ結果を得ました。StatusBarのレイアウトを作成しますstatus_bar.xml

<View xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="@dimen/statusBarHeight"
     android:background="@color/primaryColorDark"
     android:elevation="@dimen/statusBarElevation">

高さと高度の属性に注意してください。これらは、values、values-v19、values-v21でさらに下に設定されます。

include、main_activity.xmlを使用して、このレイアウトをアクティビティレイアウトに追加します。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Black" >

<include layout="@layout/status_bar"/>
<include android:id="@+id/app_bar" layout="@layout/app_bar"/>
//The rest of your layout       
</RelativeLayout>

ツールバーに、上部マージン属性を追加します。

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:elevation="@dimen/toolbarElevation"
android:layout_marginTop="@dimen/appBarTopMargin"
android:textDirection="ltr"
android:layoutDirection="ltr">

appTheme style-v19.xmlおよびstyles-v21.xmlにwindowTranslucent属性を追加します。

styles-v19.xml、v21:

<resources>
<item name="android:windowTranslucentStatus">true</item>
</resources>

最後に、dimens、dimens-v19、dimens-v21に、ツールバーのtopMarginの値と、kitKat未満のstatusBarHeight:dimens.xmlの高さを追加します。

<resources>
<dimen name="toolbarElevation">4dp</dimen>
<dimen name="appBarTopMargin">0dp</dimen>
<dimen name="statusBarHeight">0dp</dimen>
</resources>

ステータスバーの高さは、KitKat以降では常に24 dp dimens-v19.xmlです。

<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>

Lolipopのdimens-v21.xml、必要に応じて標高を追加します。

<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>

これは、Jellybean KitKatとLollipopの結果です。

ここに画像の説明を入力してください


したがって、コードにチェックを入れる代わりに、XMLに入れます。あなたの解決策は、彼が得たものと同じように、キットカットで動作します。
Androidデベロッパー

26

次の簡単なコードを使用できます。

コトリンのワンライナー:

window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)

Javaでの元の答えと手動バージョンチェック:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light, this.getTheme()));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light));
}

を使用すると、これをさらに簡略化できContextCompatます。Kotlinでは、次のwindow.statusBarColor = ContextCompat.getColor(this, R.color.colorName)
とおりです。– sunadorer

私がそれを書いたときまでに、私はkotlinを試していませんでした。なぜあなたは答えを編集してそれを承認できませんか:)
steve moretz

良いアイデア。私は将来の訪問者のための簡単な参照として回答に私の提案を含めました
sunadorer

ステータスバーの色がBuild.VERSION_CODES.Mの上で変更されました。Lollipopの下では機能しない
Muhammed Haris

@MuhammedHarisそれは機能します.kotlinまたはJavaコードを使用しましたか?
スティーブモレッツ

23

ステータスバーの色である "colorPrimaryDark"を変更する新しいテーマをres / values / styles.xmlに作成するだけです。

<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/colorGray</item>
</style>

AndroidManifest.xmlのアクティビティテーマを必要なものに変更します。次のアクティビティでは、元のテーマを選択して、色を元の色に戻すことができます。

<activity
    android:name=".LoginActivity"
    android:theme="@style/AppTheme.GrayStatusBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

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

これは、res / values / colors.xmlが次のようになるはずです。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#c6d6f0</color>
    <color name="colorGray">#757575</color>
</resources>

1
これは、最も単純でありながら最もクリーンなソリューションだと思います。最小APIレベル21する必要はなく、単純にオーバーライドするだけです。より多くの投票に値する。
tahsinRupam

Nougatで実行し、apiレベルを19に設定すると、これは機能しませんでした。マニフェストのアプリケーションノードの下にandroid:themeを設定すると、機能しました。
AndroidDev

18

上記のロリポップの色を変更するには、これをstyles.xmlに追加するだけです

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

ただし、ステータスバーを明るい色にしたい場合は、この行も追加してください。

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

1
ありがとう、それも有用な答えです。
Andrew Grow、

16

この機能でステータスバーの色を変更できます。android Lで動作し、API 21以上を意味し、などの色文字列が必要です"#ffffff"

private void changeStatusBarColor(String color){
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.parseColor(color));
    }
}

15

私はこの要件を持っていました:プログラムでステータスバーの色を変更して透明保ち、ナビゲーションドロワーが透明なステータスバーに重なって描画できるようにしました。

APIを使用してそれを行うことはできません

getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)

ここでスタックをチェックする場合は、そのコード行の前に全員をオーバーフローして、ステータスバーの透明度を

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

ステータスバーの色と透明度を次のように管理できます。

  • Android 4:APIからステータスバーの色を管理できないため、できることはあまりありません...できることは、ステータスバーを半透明に設定し、ステータスの下にあるUIの色付きの要素を移動することだけです。バー。これを行うには、あなたが遊ぶ必要があります

    android:fitsSystemWindows="false"

    メインレイアウト。これにより、ステータスバーの下にレイアウトを描画できます。次に、メインレイアウトの上部にいくつかのパディングを追加する必要があります。

  • Android 5以上:スタイルを定義する必要があります

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

    これにより、ナビゲーションドロワーをステータスバーに重ねることができます。

    次に、ステータスバーを透明にしたまま色を変更するには、ステータスバーの色を次のように設定する必要があります。

    drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))

    ここで、drawerLayoutは次のように定義されています。

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

それなしで私のために働いた<item name="android:windowDrawsSystemBarBackgrounds">true</item>。とにかく、検索の数日後、私は本当に機能するものを見つけました(今のところ、Lolllipopでのみテストされています)。ありがとう
DenisGL 2018

私は同じ問題を抱えていました、そしてあなたの答えは私がこれを解決するのを助けました。
A.Gun 2018

7

値のcolors.xmlのcolorPrimaryを、ステータスバーにしたい色に編集します。例えば:

   <resources>
<color name="colorPrimary">#800000</color> // changes the status bar color to Burgundy
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#FF0000</color>
<color name="white">#FFFFFF</color>
<color name="cream">#fffdd0</color>
<color name="burgundy">#800000</color>


7

ステータスバーの色を変更するには、ステータスバーのres/values-v21/styles.xml色に移動し ます

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:statusBarColor">#0000FF</item>
    </style>
</resources>

ね,、助けてくれませんか?私はAndroidについて何も知りませんし、今は学習を始めることができません。シンプルなアプリの魔女がhtmlファイルを実行しています。ステータスバーの色を変えたくてたまらないのは、#000の上部と下部が私のパレットに恐ろしいからです。しかし、私はそれができないだけで、styles.xmlファイルも見つけることができません...私のapkをあなたに送信でき、あなたがそれを私に設定した場合、私は感謝します!
Thiago Soubra

6

プログラムでステータスバーの色を変更する場合(デバイスにAndroid 5.0が搭載されている場合)。これは、 さまざまなフラグメントのステータスバーの色が異なる場合に、アクティビティからstatusBarColorを変更する簡単な方法であり、非常に簡単なメソッドです。

 /**
 * @param colorId id of color
 * @param isStatusBarFontDark Light or Dark color
 */
fun updateStatusBarColor(@ColorRes colorId: Int, isStatusBarFontDark: Boolean = true) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val window = window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window.statusBarColor = ContextCompat.getColor(this, colorId)
        setSystemBarTheme(isStatusBarFontDark)
    }
}

/** Changes the System Bar Theme.  */
@RequiresApi(api = Build.VERSION_CODES.M)
private fun setSystemBarTheme(isStatusBarFontDark: Boolean) {
    // Fetch the current flags.
    val lFlags = window.decorView.systemUiVisibility
    // Update the SystemUiVisibility depending on whether we want a Light or Dark theme.
    window.decorView.systemUiVisibility = if (isStatusBarFontDark) lFlags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() else lFlags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}

5

Android 4.4以降で作業する場合は、こちらをお試しください。Harpreetの回答とこのリンクを参照します。Androidと透明ステータスバー

まず、アクティビティのonCreateメソッドでsetStatusBarColoredメソッドを呼び出します(私はutilクラスに入れました)。こちらは画像を使用していますが、色を変えるように変更できます。

public static void setStatusBarColored(Activity context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
    {
        Window w = context.getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        int statusBarHeight = getStatusBarHeight(context);

        View view = new View(context);
        view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        view.getLayoutParams().height = statusBarHeight;
        ((ViewGroup) w.getDecorView()).addView(view);
        view.setBackground(context.getResources().getDrawable(R.drawable.navibg));
    }
}

public static int getStatusBarHeight(Activity context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

前: 前

後: 後

ステータスバーの色は変更されましたが、ナビバーは切り取られているため、onCreateメソッドでナビバーのマージンまたはオフセットを設定する必要があります。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, (int)(this.getResources().getDimension(R.dimen.navibar_height)));
        layoutParams.setMargins(0, Utils.getStatusBarHeight(this), 0, 0);

        this.findViewById(R.id.linear_navi).setLayoutParams(layoutParams);
    }

すると、ステータスバーは次のようになります。

ステータスバー


4

これは、KitKatで私のために働いたものであり、良い結果をもたらしました。

public static void setTaskBarColored(Activity context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        {
            Window w = context.getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //status bar height
            int statusBarHeight = Utilities.getStatusBarHeight(context);

            View view = new View(context);
            view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            view.getLayoutParams().height = statusBarHeight;
            ((ViewGroup) w.getDecorView()).addView(view);
            view.setBackgroundColor(context.getResources().getColor(R.color.colorPrimaryTaskBar));
        }
    }

2

もう1つの解決策:

final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);

これは、ステータスバーが画面の下部にあるタブレットで機能しますか?
guy.gc

6
ここで「w」と「UiUtil」は何ですか?
Manav Patadia 2016

2

colorPrimaryDarkをres / values / styles.xmlファイルの希望する色に変更します。

    <resources>
        <color name="colorPrimary">#800000</color>
        <color name="colorPrimaryDark">#303F9F</color> //This Line
        <color name="colorAccent">#FF4081</color>
        <color name="red">#FF0000</color>
        <color name="white">#FFFFFF</color>
       <color name="cream">#fffdd0</color>
       <color name="burgundy">#800000</color>
    </resources>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.