Как установить прозрачность строки состояния, но оставить черным панель навигации? - PullRequest
1 голос
/ 01 мая 2019

Как подсказывает мой вопрос, я пытаюсь выяснить, как сделать цвет строки состояния прозрачным, сохраняя панель навигации черным / естественным цветом (без влияния на высоту экрана) Я ссылался на этот сайт: Android Полностью прозрачная строка состояния? Одно из решений, которое частично сработало, было:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

но это толкает содержимое моего экрана ниже панели навигации, делая его прозрачным. Я хочу, чтобы размер экрана оставался неизменным при сохранении естественного цвета панели навигации. Просто хочу сделать строку состояния прозрачной, но, похоже, все остальные способы делают ее не совсем белой, даже если я установил ее прозрачной с помощью опции (setstatusbarcolor).

Есть идеи, как это сделать? Моя min SDK версия - 23 .

The first view without doing anything

Второй вид - это вид после добавления кода выше, где строка состояния работает, но экран скользит ниже, что делает прозрачной и панель навигации (даже настройка fitsSystemWindows = false не помогает).

enter image description here

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Вам нужно добавить следующий стиль в тему вашей деятельности.

В styles.xml найдите тему вашей деятельности и добавьте следующее. Поскольку в вашем случае минимальная версия SDK составляет 23, вам не нужно беспокоиться о предыдущих версиях Android.

<item name="android:windowDrawsSystemBarBackgrounds">false</item>
<item name="android:windowTranslucentStatus">true</item>

Вот скриншот того, что у меня есть.

enter image description here

Вот стиль темы, который у меня есть в моем случае.

<style name="NoActionBar" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowActionBar">false</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">false</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

Надеюсь, что решит вашу проблему.

0 голосов
/ 02 мая 2019

Попробуйте сделать перечисленные ниже вещи, которые могут помочь вам в вашем примере. Позвольте мне, если вы все еще сталкиваетесь с проблемой. Если это решит вашу проблему, пожалуйста, предоставьте ответ.

AndroidManifest.xml

<activity
   ....            
   android:theme="@style/TranslucentStatusBarTheme">
</activity>

values-v23\styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="TranslucentStatusBarTheme" parent="AppTheme">
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:windowLightStatusBar">true</item>
    </style>
</resources>

Activity.java

private static void setWindowFlag(Activity activity, boolean on) {
    Window win = activity.getWindow();
    WindowManager.LayoutParams winParams = win.getAttributes();
    if (on) {
        winParams.flags |= WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    } else {
        winParams.flags &= ~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
    }
    win.setAttributes(winParams);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    // Check if the version of Android is Marshmallow or higher
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        int newUiOptions = getWindow().getDecorView().getSystemUiVisibility();
        newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;

        getWindow().getDecorView().setSystemUiVisibility(newUiOptions
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
    }
    // Check if the version of Android is Lollipop or higher
    else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        setWindowFlag(this, false);
        getWindow().setStatusBarColor(ContextCompat.getColor(this, R.color.colorTranslucent));
    }

    super.onCreate(savedInstanceState);
}
...