Полноэкранный липкий иммерсивный режим Android — как изменить фон панели навигации или цвет значков?

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

Проблема в Android 10 (и, возможно, в других версиях): панель навигации внизу экрана — это просто белые значки. Нет прозрачного черного фона. Это делает его действительно трудно увидеть с легким пользовательским интерфейсом.

Есть ли способ изменить цвет фона или значков панели навигации? В частности, липкая иммерсивная панель навигации, которая появляется и исчезает (поскольку она слишком легкая для работы со светлым пользовательским интерфейсом).

Я пробовал стили и задавал цвет программно, но они работают только в неполноэкранном режиме:

<!-- does not work -->
<item name="android:navigationBarColor">@android:color/white</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowLightNavigationBar">true</item>

Я также пытался слушать OnSystemUiVisibilityChangeListener, чтобы показать свою прозрачную панель за панелью навигации, но она не срабатывает для липкого иммерсивного режима (как объясняется в этом сообщении SO и видео):

Обнаружение, когда системный пользовательский интерфейс виден с липким иммерсивным режим

https://www.youtube.com/watch?v=cBi8fjv90E4&feature=youtu.be&t=6m56s

Код действия для настройки полноэкранного режима (kotlin):

protected fun isFullscreen() = defaultSharedPref.getBoolean(SharedPreferenceKey.IS_FULL_SCREEN, false)

private fun supportsFullscreenMode(): Boolean {
    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
}

override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if (hasFocus && isFullscreen()) toggleFullScreenMode(true)
}

/**
 * "sticky immersive" full screen mode.
 * When user swipes from top/bottom edge, transparent status bar and navigation bar appear and slowly fade out if not used.
 * https://developer.android.com/training/system-ui/immersive
 */
protected fun toggleFullScreenMode(goFullScreen: Boolean) {
    when {
        !supportsFullscreenMode() -> {
            makeActivityToast("Your version of Android is too old to support this feature", Toast.LENGTH_LONG).show()
        }
        goFullScreen -> {
            hideSystemUI()
        }
        !goFullScreen -> {
            showSystemUI()
        }
    }
}

private fun showSystemUI() {
    window.decorView.systemUiVisibility = 0
}

private fun hideSystemUI() {
    window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        // Set the content to appear under the system bars so that the
        // content doesn't resize when the system bars hide and show.
        or View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
        // Hide the nav bar and status bar
        or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION or View.SYSTEM_UI_FLAG_FULLSCREEN)
}

person Lifes    schedule 05.06.2020    source источник