Android Lollipop Set Статус строки текста Цвет
Я пытаюсь установить цвет текста строки состояния в Android v21, но не вижу метода API для этого. Вот что у меня пока на заднем плане
MyActivity.java > onCreate:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(getResources().getColor(R.color.white));
}
Очевидно, белый текст на белом фоне не будет работать. Я ищу что-то вроде
window.setStatusBarTextColor(getResources().getColor(R.color.orange));
8 ответов
Android 5.0
мы можем изменить только цвет строки состояния, а не цвет текста строки состояния.
нет такого метода, как
setStatusBarTextColor(getResources().getColor(R.color.orange));
Короче говоря, это невозможно на Android 5.0. Проверьте этот ответ
Вы не можете установить цвет текста в строке состояния, указав любой цвет явно
Но вы можете попробовать ниже альтернативу, которая добавлена в API 23,
Вы можете использовать атрибут "android:windowLightStatusBar" двумя способами
- "android:windowLightStatusBar" = true, цвет текста строки состояния будет совместим (серый), если цвет строки состояния светлый
- "android:windowLightStatusBar" = false, цвет текста строки состояния будет совместим (белый), если цвет строки состояния темный
<style name="statusBarStyle" parent="@android:style/Theme.DeviceDefault.Light"> <item name="android:statusBarColor">@color/status_bar_color</item> <item name="android:windowLightStatusBar">false</item> </style>
Вы можете проверить выше API в ссылке ниже - https://developer.android.com/reference/android/R.attr.html
Вот Java-реализация Gandalf458.
/** Changes the System Bar Theme. */
@RequiresApi(api = Build.VERSION_CODES.M)
public static final void setSystemBarTheme(final Activity pActivity, final boolean pIsDark) {
// Fetch the current flags.
final int lFlags = pActivity.getWindow().getDecorView().getSystemUiVisibility();
// Update the SystemUiVisibility dependening on whether we want a Light or Dark theme.
pActivity.getWindow().getDecorView().setSystemUiVisibility(pIsDark ? (lFlags & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) : (lFlags | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR));
}
Вы также можете сделать это во время выполнения. Вот пример для Mono.Android с использованием флага SystemUiVisibility. Вы должны сделать несколько побитовых операций, чтобы изменить флаг. Ваше приложение должно быть настроено на целевой API 23 или выше для компиляции с этим флагом.
//Android 6.0 introduced the ability to set a light colored text on the status bar
//MyActivity needs to be changed to your activity
if(Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.M)
{
int newUiVisibility = (int)MyActivity.Window.DecorView.SystemUiVisibility;
if(state == StatusBarState.Light)
{
//Dark Text to show up on your light status bar
newUiVisibility |= (int)Android.Views.SystemUiFlags.LightStatusBar;
}
else if(state == StatusBarState.Dark)
{
//Light Text to show up on your dark status bar
newUiVisibility &= ~(int)Android.Views.SystemUiFlags.LightStatusBar;
}
MyActivity.Window.DecorView.SystemUiVisibility = (Android.Views.StatusBarVisibility)newUiVisibility;
}
public enum StatusBarState
{
Light,
Dark
}
ДЛЯ Android 6.0+
Вы можете использовать это, чтобы изменить цвет содержимого строки состояния на черный на фоне, как показано на рисунке ниже.
View decorView = this.getWindow().getDecorView();
int systemUiVisibilityFlags = decorView.getSystemUiVisibility();
systemUiVisibilityFlags &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
decorView.setSystemUiVisibility(systemUiVisibilityFlags);
По умолчанию он черный, поэтому оставьте его на светлом фоне.
@Sunita ответ правильный, но если вы используете API 21, цвет строки состояния будет светлым, если вы установите это, и цвет текста строки состояния также будет светлым, и на 23+ он будет работать нормально. В новом API с темами и ночными темами (темный режим) я бы сделал это, добавив v23/styles.xml и установив там фон строки состояния и цвет текста:
<item name="android:statusBarColor">@color/lightColor</item>
<item name="android:windowLightStatusBar">true</item>
А ночью /styles.xml:
<item name="android:statusBarColor" tools:targetApi="l">@color/darkColor</item>
<item name="android:windowLightStatusBar" tools:targetApi="m">false</item>
По умолчанию styles.xml не будет содержать ни этого кода, ни только этого, но не забудьте не устанавливать его на свет:
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item>
Таким образом, мы устанавливаем светлый фон (и цвет текста) для строки состояния, но только для устройств с api 23+. На устройствах <23 фон не будет изменен, так как я думаю, что мы не хотим знать, что цвет текста останется белым. Темная тема была добавлена в API 29, поэтому нам не нужно бояться темной темы на API 21;)
Однако недостатком этого является то, что мы добавляем еще один файл, которым нам нужно будет помнить, чтобы управлять им.
Мое предпочтительное решение до сих пор
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else {
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
getWindow().setStatusBarColor(ContextCompat.getColor(MainActivity.this, R.color.colorSecondPrimaryColor));
}
Вы можете использовать эту строку, чтобы установить более темный цвет текста, когда вы используете белый цвет для строки состояния.
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);