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);
Другие вопросы по тегам