Как изменить цвет строки состояния в android

Прежде всего это не дубликат, как в Как изменить цвет фона в строке состояния Android

Как изменить цвет строки состояния, который должен быть таким же, как на панели навигации.

Я хочу, чтобы цвет строки состояния был таким же, как цвет панели навигации

enter image description here

Ответ 1

Обновление:

Lollipop:

public abstract void setStatusBarColor (int color)

Добавлено на уровне API 21

Android Lollipop принес с собой возможность изменить цвет строки состояния в вашем приложении для более захватывающего взаимодействия с пользователем и в соответствии с Googles Material Design Guidelines.

Вот как вы можете изменить цвет строки состояния, используя новый метод window.setStatusBarColor, представленный в API level 21.

Изменение цвета строки состояния также требует установки двух дополнительных флагов в окне; вам нужно добавить флаг 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)

Пример:материал-дизайн-везде

Крис Бейнс Blog- appcompat v21: дизайн материала для устройств перед леденцом на палочке!

enter image description here

transitionName для фона обзора будет android:status:background.

Ответ 2

В Android 5.0 Lollipop появилась тема Material Design, которая автоматически окрашивает строку состояния в соответствии colorPrimaryDark значением colorPrimaryDark темы.

Это поддерживается на устройстве перед леденцом на палочке благодаря библиотеке support-v7-appcompat, начиная с версии 21. Блог-пост о поддержке appcompat v21 от Криса Бэйнса

enter image description here

Узнайте больше о Материальной теме на официальном сайте разработчиков Android.

Ответ 3

Поместите это ваши значения-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>

Ответ 4

Это очень простой способ сделать это без какой-либо библиотеки: если версия ОС не поддерживается - под kitkat - так ничего и не случилось. Я делаю следующие шаги:

  • в моем 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));

Ответ 5

Ну, решение Ижара было в порядке, но, лично я пытаюсь избежать кода, который выглядит следующим образом:

 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">

Обратите внимание на атрибуты высоты и высоты, они будут установлены в значениях, значения-v19, значения-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 attr:

styles-v19.xml, v21:

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

И наконец, на твоих размерах dimens-v19, dimens-v21 добавьте значения для панели инструментов topMargin и высоту statusBarHeight: dimens.xml меньше, чем KitKat:

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

Высота строки состояния всегда 24dp dimens-v19.xml для KitKat и выше:

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

dimens-v21.xml для Lolipop, просто добавьте высоту, если необходимо:

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

Это результат для Jellybean KitKat и Lollipop:

enter image description here

Ответ 6

Как @Niels сказал, что вы должны поместить в значения-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>

Ответ 7

Просто создайте новую тему в res/values ​​/styles.xml, где вы измените "colorPrimaryDark", который является цветом строки состояния:

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

Ответ 8

Вы можете использовать этот простой код:

Однострочник в Котлине:

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

Ответ 9

У меня было это требование: Изменять программно цвет строки состояния, сохраняя его прозрачным, чтобы позволить навигационному ящику нарисовать себя, перекрывая прозрачную строку состояния.

Я не могу этого сделать с помощью API

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

Если вы проверите здесь в переполнении стека все перед этой строкой кода, установите прозрачность строки состояния на сплошную с

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

Я могу управлять цветом и прозрачностью строки состояния следующим образом:

  • Android 4: вы не можете много сделать, потому что вы не можете управлять цветом строки состояния из API... единственное, что вы можете сделать, это установить строку состояния как полупрозрачную и перемещать цветной элемент из пользовательского интерфейса в строке состояния. Для этого вам нужно играть с

    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">
    

Ответ 10

Вы можете изменить цвет строки состояния с помощью этой функции. работы на 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

Отредактируйте colorPrimary в colors.xml в Values, чтобы цвет, которым вы хотите, чтобы была строка состояния. Например:

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

Ответ 12

Если вы хотите работать на Android 4.4 и выше, попробуйте это. Я имею в виду ответ Harpreet и эту ссылку. Android и прозрачная строка состояния

Сначала вызовите метод setStatusBarColored в методе Activity onCreate (я поместил его в класс 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

Ответ 13

Это то, что сработало для меня в 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));
        }
    }

Ответ 14

Чтобы изменить цвет для вышеупомянутого lolipop просто добавьте это к вашему styles.xml

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

но помните, если вы хотите иметь светлый цвет для строки состояния, добавьте эту строку тоже

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

Ответ 15

Еще одно решение:

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

Ответ 16

замените 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>

Ответ 17

Если вам нужно поддержать Lollipop и выше,

Вот метод, который я использую для изменения цвета фона/текста строки состояния:

@RequiresApi(api = VERSION_CODES.LOLLIPOP)
public void setStatusBarColor(Activity activity, int color, boolean darkText, boolean translucant) {
    activity.getWindow().addFlags(LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    activity.getWindow().clearFlags(LayoutParams.FLAG_TRANSLUCENT_STATUS);

    // The translucant argument should be true or false depending on the desired result.
    if (translucant) { 
        activity.getWindow().addFlags(LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    } else {
        activity.getWindow().clearFlags(LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    }

    activity.getWindow().setStatusBarColor(color);

    if (VERSION.SDK_INT >= VERSION_CODES.M) {
        View view = activity.getWindow().getDecorView();
        int flags = view.getSystemUiVisibility();

        if (darkText) {
            flags |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
        } else {
            flags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
        }

        view.setSystemUiVisibility(flags);
    }
}

Вот несколько примеров:

setStatusBarColor(activity, Color.TRANSPARENT, true, false);
setStatusBarColor(activity, Color.BLUE, false, false);
setStatusBarColor(activity, Color.parseColor("#e5e5e5"), true, false);
  • Как вы можете видеть, логическое значение darkText поддерживается в Marshmallow и выше.

Вы можете вызывать этот метод из любого места в любое время, если доступна ссылка " Activity.