web-dev-qa-db-ja.com

アンドロイドのステータスバーの色を変更する方法

まず最初に、 Androidステータスバーの背景色を変更する方法 のように重複していません。

ナビゲーションバーと同じステータスバーの色を変更するにはどうすればよいですか。

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

enter image description here

305
codercat

更新:

ロリポップ:

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フラグをクリアする必要があります。

ワーキングコード:

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

Chris Banes Blog- appcompat v21:プリロリポップ機器のための材料設計!

enter image description here

ビューの背景のtransitionNameAndroid:status:backgroundになります。

295
codercat

Android 5.0 Lollipopは、テーマのcolorPrimaryDarkの値に基づいてステータスバーを自動的に着色するMaterial Designテーマを導入しました。 

これはLollipopより前のバージョン21以降のライブラリsupport-v7-appcompatのおかげでサポートされています。 Chris Banesのsupport appcompat v21に関するブログ記事

enter image description here

公式Android開発者ウェブサイトでMaterialテーマの詳細を読んでください

485
Giorgio

これをLollipopで有効にするには、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">@color/color_primary</item>
    </style>
</resources>
172
Niels

これはライブラリなしでこれを行うのが非常に簡単な方法です: OSのバージョンがサポートされていない場合 - KitKatの下で - 何も起こりません。

  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));
47
itzhar

そうですね、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">

Height属性とelevation属性に注意してください。これらはvalues-values 19、values-v 21でさらに下に設定されます。

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 attrを追加します。

styles-v19.xml、v21:

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

そして最後に、あなたのdimen、dimens-v19、dimens-v21に、ツールバーtopMarginの値とstatusBarHeightの高さを追加します。

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

ステータスバーの高さは、KitKat以上では常に24dp 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の結果です。

enter image description here

29
Moti Bartov

ステータスバーの色である "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>
17
lcompare

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

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

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

<item name="Android:statusBarColor" tools:targetApi="Lollipop">@color/black</item>
15
Faisal Shaikh

私はこの必要条件を持っていました: それを透明に保っているプログラムでステータスバーの色を変えること 、Navigation Drawerがそれ自身を透明なステータスバーの上に重ねて描くことができるように。

APIを使ってそれができない

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

ここでスタックオーバーフローをチェックすると、そのコード行の前の全員がステータスバーの透明度を次のようにしてsolidに設定します。

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

私は 色と透明度 ステータスバーの管理をすることができます:

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

    Android:fitsSystemWindows="false"
    

    メインレイアウトにこれにより、ステータスバーの下にレイアウトを描くことができます。それからあなたはあなたのメインレイアウトの一番上にいくらかのパディングで遊ぶ必要があります。

  • アンドロイド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">
    
12
DSoldo

この機能でステータスバーの色を変えることができます。 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));
    }
}
11
sajad abbasi

Android 4.4以上で作業したい場合は、これを試してください。私はHarpreetの答えとこのリンクを参照してください。 Androidと透明ステータスバー

まず、Activityの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;
}

前:  before

後: after

ステータスバーの色は変更されましたが、ナビゲーションバーは切り取られているので、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);
    }

ステータスバーはこのようになります。

status bar

5
Allan

これが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));
        }
    }
4
Harpreet

Valuesの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>

3
PhilipS

もう一つの解決策:

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);
2
Vova K.

この単純なコードを使うことができます:

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));
}
1
steve moretz

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>

上記のロリポップの色を変更するには、styles.xmlに追加します

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

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

<item name="Android:windowLightStatusBar">true</item>
0