Почему мы не можем использовать прозрачные системные панели с ActionBar

При обновлении моих приложений в Kitkat я просто хотел дать им великолепный взгляд на KitKat, используя свойство Translucent:

Прозрачные системные панели

Теперь вы можете сделать панели систем частично полупрозрачными с новыми темами, Theme.Holo.NoActionBar.TranslucentDecor и Theme.Holo.Light.NoActionBar.TranslucentDecor. Включив полупрозрачные системные панели, ваш макет заполнит область за системными панелями, поэтому вы также должны включить [fitsSystemWindows] [4] для части вашего макета, которая не должна быть покрыта системными барами.

Моя единственная забота заключается в том, что я хотел бы использовать ActionBar, который звучит противоположно тому, что хочет Google (обе темы имеют NoActionBar:

Theme.Holo.NoActionBar.TranslucentDecor 
Theme.Holo.Light.NoActionBar.TranslucentDecor 

Поскольку я не планирую использовать некоторые хаки или трюки, чтобы заставить его работать, я просто хотел знать, есть ли какой-то правильный способ достичь этого или если это будет против рекомендаций Google.

enter image description here

Ответ 1

Вы можете создать свою собственную тему с android.R.attr#windowTranslucentStatus, установленным в true, чтобы добиться такого же эффекта, не теряя ActionBar.

Из документов:

Флаг, указывающий, запрашивает ли это окно полупрозрачную строку состояния. Соответствует              к {@link android.view.WindowManager.LayoutParams # FLAG_TRANSLUCENT_STATUS}.

Стили. Помните, что они вошли бы в values-v19.

<style name="TranslucentStatusBar" parent="@android:style/Theme.Holo.Light">
    <item name="android:actionBarStyle">@style/TranslucentActionBar</item>
    <item name="android:windowTranslucentNavigation">false</item>
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowContentOverlay">@null</item>
</style>

<style name="TranslucentActionBar" parent="@android:style/Widget.Holo.Light.ActionBar">
    <item name="android:background">@android:color/transparent</item>
</style>

Разметка

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_dark"
    android:fitsSystemWindows="true" >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/holo_purple" />

</FrameLayout>

Результаты

enter image description here

Ответ 2

Это работает с меньшим количеством строк:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        Window w = getWindow(); // in Activity onCreate() for instance
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    }

Было бы здорово, если бы кто-то мог добавить, как проверить, если полупрозрачная навигация доступна вообще, потому что N10, например. будет отключена прозрачная навигация с помощью Build.VERSION_CODES.KITKAT. Изменить: ответили в этом вопросе: Проверьте, доступна ли прозрачная навигация

Ответ 3

Код ниже хорошо работает в моем приложении.

полупрозрачный:

Window w = getWindow();
                w.setFlags(
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                w.setFlags(
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
                        WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

Сессия не является полупрозрачной:

final WindowManager.LayoutParams attrs = getWindow()
                        .getAttributes();
                attrs.flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
                attrs.flags &= (~WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
                getWindow().setAttributes(attrs);
                getWindow().clearFlags(
                        WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

Ответ 4

Это ответ, который я искал: https://github.com/jgilfelt/SystemBarTint

Android 4.4 (KitKat) представила систему полупрозрачного системного UI для статус и навигационные панели. Эти стили отлично подходят для обоев таких как стартовый экран, но минимальный фон предоставляемая защита делает их менее полезными для других видов деятельности если вы не предоставите свой собственный фон внутри своего макета. Определение размер, положение и наличие пользовательского интерфейса системы для данного устройства конфигурация может быть нетривиальной.

Эта библиотека предлагает простой способ создания фонового "оттенка" для системных баров, будь то значение цвета или Drawable. По умолчанию он даст вы получите полупрозрачный черный фон, который будет полезен для полноцветных экраны содержимого, где постоянный пользовательский интерфейс системы все еще важен - например, при размещении по карте или сетке фотографий.

enter image description here

Ответ 5

Все ответы расширяют ActionBar либо программно, либо из макета: что это означает, что когда приложение запускается или воссоздается, система будет искать тему (которая не знает об исправлении) и показывает ОЧЕНЬ УГЛИ строка состояния, окрашенная любым окном фона...!

Я создал пример того, как это сделать, используя только тему:

https://github.com/Takhion/android-extendedactionbar

Я надеюсь, что это будет полезно для кого-то:)