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

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

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

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

Введите описание изображения здесь

Solutions Collecting From Web of "Как изменить цвет строки состояния в android"

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

Это поддерживается на устройстве pre-lollipop благодаря поддержке библиотеки v7-appcompat начиная с версии 21. Blogpost о поддержке appcompat v21 от Chris Banes

Введите описание изображения здесь

Подробнее о теме материала на официальном сайте разработчиков Android

Обновить:

Леденец:

 public abstract void setStatusBarColor (int color) 

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

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

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

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

Offcial: http://developer.android.com/reference/android/view/Window.html#setStatusBarColor ( int )

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

https://chris.banes.me/2014/10/17/appcompat-v21/

Введите описание изображения здесь

TransName для фона представления будет « android:status:background ».

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

Это очень простой способ сделать это без какой-либо библиотеки: если версия ОС не поддерживается – под 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); } } 

Также вам нужны эти оба метода, чтобы получить действие Bar & status bar height:

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

Ну, решение 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"> 

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

Введите описание изображения здесь

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

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

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

Просто создайте новую тему в 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> 

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

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

Тогда строка состояния будет выглядеть так.

статус бар