SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR не работает на API 28 - PullRequest
0 голосов
/ 03 мая 2019

У меня проблема с SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR как-то не работает, но SYSTEM_UI_FLAG_LIGHT_STATUS_BAR работает. В данный момент я работаю с Android API 28.

Так что же происходит? По API 23 и ниже я получаю полупрозрачную строку состояния и панель навигации, как и ожидалось. Между API 23 и API API 26 я получаю прозрачную панель навигации и строку состояния в легком режиме, как и ожидалось. Но на API 27 и выше я получаю строку состояния Light Mode, но не панель навигации Light Mode. Это просто обычный черный и ничего не меняется.

Вот мой MainActivity с моим кодом для включения полупрозрачного или легкого режима Строка состояния и панель навигации на основе уровня API Android (обратите внимание, мои комментарии описывают, что работает, а что нет):

View decorView = getWindow().getDecorView();
Window win = getWindow();

//Setup Status Bar and Nav Bar white if supported
if(Build.VERSION.SDK_INT >= 27) {
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);// <- works not
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); // <- works
}
else if (Build.VERSION.SDK_INT >= 23 && Build.VERSION.SDK_INT < 27) {
    //this here works
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
    win.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
} else {
    //this here works
    win.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    win.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}

А вот и мой style.xml:

<resources xmlns:tools="http://schemas.android.com/tools">

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.MaterialComponents.Light">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorWhite</item>
        <item name="colorPrimaryDark">@color/colorWhite</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="android:textColorPrimary">@color/colorBlack</item>
        <item name="android:fitsSystemWindows">true</item>
    </style>

</resources>

Не могли бы вы, ребята, сказать мне, чего не хватает? Я использую тот же код для панели навигации, что и для строки состояния, но только в строке состояния отображается легкий режим. Спасибо за любую помощь

Ответы [ 2 ]

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

После часов тестирования я разобрался!Сначала вам нужно установить белую панель навигации в xml с целевым API выше 26 в вашем style.xml:

 <item name="android:navigationBarColor" tools:targetApi="27">@android:color/white</item>

После этого вы должны импортировать этот флаг в свою основную деятельность:

import static android.view.WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;

И в вашем коде вы должны установить все флаги так:

if(Build.VERSION.SDK_INT >= 27) {
    decorView.setSystemUiVisibility(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | 
             View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR |
             View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}

И теперь, если я выше API 26, я получаю Light Nav и строку состояния!

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

В вашем коде NAVIGATION_BAR флаг переопределяется на STATUS_BAR Флаг.

Чтобы добавить оба флага заменить.

decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

С

decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

Обновление: Вы также можете указать цвет панели навигации

getWindow().setNavigationBarColor(ContextCompat.getColor(this, R.color.primary));
...