Как получить прозрачную строку состояния, но оставить панель навигации непрозрачной? - PullRequest
0 голосов
/ 02 мая 2018

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

Я могу сделать оба прозрачных, установив getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

Я могу сделать верх полупрозрачным (частично прозрачным), установив <item name="android:windowTranslucentStatus">true</item>

Тем не менее, я не могу сделать верх полностью прозрачным, не сделав нижнюю тоже прозрачной. Использование <item name="android:statusBarColor">@android:color/transparent</item> или аналогичного не работает.

Кто-нибудь знает, как сделать полностью прозрачную строку состояния, не затрагивая панель навигации?

1 Ответ

0 голосов
/ 03 мая 2018

Чтобы независимо контролировать прозрачность состояния и панелей навигации на KitKat, вы можете просто использовать флаги оконного менеджера FLAG_TRANSLUSCENT_STATUS и FLAG_TRANSLUSCENT_NAVIGATION в методе onCreate() своей деятельности. Однако в KitKat система может рисовать полупрозрачную градиентную сетку, отображаемую поверх строки состояния. Похоже, это зависит от устройства: на моем устройстве KitKat оно полностью прозрачно, но в эмуляторе Android Studio отображается скрим.

В Lolliop или более поздней версии вы можете вместо этого установить цвет строки состояния, используя метод Window#setStatusBarColor(int) вместе с флагом FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS window manager. Обратите внимание, что в этом случае вы снимаете флаг FLAG_TRANSLUSCENT_STATUS. Если вы хотите, чтобы цвет был прозрачным, это означает, что ваше приложение поддерживает полноэкранный режим и устанавливает видимость системного интерфейса, поэтому ваше приложение может управлять цветом фона строки состояния.

Все это выглядело бы примерно так:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Window window = getWindow();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(0x00000000);  // transparent
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        int flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        window.addFlags(flags);
    }
    setContentView(R.layout.main);
    window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
}

Пример используемого макета:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ff00ff00"
    android:fitsSystemWindows="false"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Hello World!"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:orientation="vertical">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </LinearLayout>

</RelativeLayout>

Пример скриншотов.

Lollipop:

Lollipop+

KitKat:

Kitkat

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...