Как изменить цвет строки состояния в 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
.