Переключение между полноэкранным и не полноэкранным режимом вызывает смещение вида - PullRequest
0 голосов
/ 26 января 2019

У меня есть приложение, в котором определенные представления должны быть полноэкранными, а другие не должны быть полноэкранными. В некоторых случаях я хочу, чтобы фон отображался под строкой состояния, поэтому я использую его при загрузке представления, чтобы сделать действие полноэкранным:

window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
window.statusBarColor = Color.TRANSPARENT

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

window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
window.statusBarColor = ContextCompat.getColor(context, R.color.colorPrimaryDark)

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

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

РЕДАКТИРОВАТЬ:

Чтобы дать больше информации - я не переключаюсь между действиями, я просто переключаюсь, какой вид отображается в действии. Когда мой вид прикреплен, я вызываю флаги decorView

1 Ответ

0 голосов
/ 04 февраля 2019

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

Вот реализация:

Сначала я устанавливаю свои флаги окна следующим образом:

window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
        or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
        or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN)

, затем в моем родительском представлении у меня есть эти вызовы:

val statusBarHeight: Int
    get() {
        var result = 0
        val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
        if (resourceId > 0) {
            result = resources.getDimensionPixelSize(resourceId)
        }
        return result
     }

private var shouldShowBlueBar: Boolean = false

private fun hideSystemUI() {
    // registered main view is the content view and I'm, setting it it to have
    // no padding so it goes right to the top of the screen and shows under the
    // status bar
    registered_main_view.setPadding(0, 0, 0 ,0)
    window.statusBarColor = Color.TRANSPARENT
}

private fun showSystemUI() {
    // here I put padding that is the height of the status bar to keep the
    // main content view below the status bar
    registered_main_view.setPadding(0, statusBarHeight, 0 ,0)
    window.statusBarColor = ContextCompat.getColor(context, R.color.colorPrimaryDark)
}

override fun toggleHeaderBlue(showBar: Boolean) {
    shouldShowBlueBar = showBar
    if (shouldShowBlueBar) {
        showSystemUI()
    } else {
        hideSystemUI()
    }
}

override fun onWindowFocusChanged(hasFocus: Boolean) {
    super.onWindowFocusChanged(hasFocus)
    if (shouldShowBlueBar)
        showSystemUI()
    else
        hideSystemUI()
}

и я просто вызываю toggleHeaderBlue (), когда мне нужно переключиться между показом или не показом строки состояния.

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