Как нарисовать макет с видами под системными панелями? - PullRequest
0 голосов
/ 07 сентября 2018

Я должен сделать макет, где верх макета должен быть нарисован под SystemBars. (минимальный уровень API для этого приложения - 22)

Я установил эти флаги для достижения этой цели. В других действиях я могу нарисовать целый фрагмент с видами под SystemBars, но здесь я не могу это сделать.

Я использовал этот код, чтобы разрешить рисование макета в SystemBars

window.apply {
        addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        statusBarColor = resources.getColor(android.R.color.transparent)
        navigationBarColor = resources.getColor(android.R.color.transparent)
        setBackgroundDrawable(background)
        decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    }

Это результат в приложении:

enter image description here

Мне нужно нарисовать эту серую область под системной панелью.

Обновление:

@ Redman решение сработало только частично. Теперь я могу рисовать под StatusBar, но также я могу рисовать под программными кнопками (navigationButtons), как вы можете видеть на экране ниже. Есть ли способ, как разрешить рисование макета в SystemBars, но не разрешить его в navigationButtons? Потому что тот код, который я опубликовал, работает для разных фрагментов в приложении. Но в других фрагментах у меня нет ImageView как части ToolBar. Если у вас есть только ToolBar с, например, 2-цветным градиентным фоном и некоторыми backButton + SearchView, это работает нормально. Но когда я добавлю ImageView, ImageView не будет "скользить" под вершиной SystemBar(aka StatusBar). Даже на изображении выше вы можете ясно видеть этот зеленый цвет (это фон панели инструментов, нарисованный под StatusBar). Но ImageView не может быть нарисовано под этим баром.

Единственный способ добиться этого - использовать эту специальную строку кода

window.apply { 
        setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)

    }

но эта строка также позволяет рисовать содержимое макета в NavigationButtons (что является проблемой).

enter image description here

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Как насчет этого:

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(ContextCompat.getColor(this, R.color.primary_dark));
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        int flags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
        window.addFlags(flags);
    }

Это должно сделать прозрачным только StatusBar.


Если это не помогло, попробуйте добавить:

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

К Activity коду стилей в styles.xml.

0 голосов
/ 07 сентября 2018

Все, что вам нужно сделать, это установить эти свойства в вашей теме:

<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>

Для вашего вида деятельности / контейнера, для которого вы хотите иметь прозрачную строку состояния, необходимо установить это свойство:

android:fitsSystemWindows="true"

Обычно на pre-kitkat выполнить это невозможно, похоже, что вы можете это сделать, но какой-то странный код делает это так.

РЕДАКТИРОВАТЬ: Я бы порекомендовал эту библиотеку: https://github.com/jgilfelt/SystemBarTint для многих элементов управления цветом строки состояния перед леденцом на палочке.

Хорошо после долгих размышлений я узнал, что ответом на полное отключение прозрачности или любого цвета, помещенного в строку состояния и панель навигации для леденца на палочке, является установка этого флага в окне:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            Window w = getWindow(); // in Activity's onCreate() for instance
            w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        }
0 голосов
/ 13 сентября 2018

использовать вид панели инструментов в вашем XML-файле.См. Пример ниже

    <android.support.v7.widget.Toolbar
            android:layout_width="match_parent"
            android:layout_height="@dimen/height_50dp"
            android:background="#f1f1f1">

\\define your any element here. Like back arrow or title

</android.support.v7.widget.Toolbar>
0 голосов
/ 07 сентября 2018

В вашей Activity теме добавьте эти свойства

 <item name="android:windowTranslucentStatus">true</item>
 <item name="android:windowTranslucentNavigation">true</item>

, а в родительском макете добавьте свойство

 android:fitsSystemWindows="true"

Редактировать

Попробуйтеэто делается программно, оно должно работать выше на устройствах с kitkat и выше

    window.apply { 
        setFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...