Подтвердить что ты не робот

Прозрачные системные бары и область содержимого в KitKat

Я пытаюсь использовать новые прозрачные системные панели KitKat, чтобы получить полноэкранное изображение на фоне моего приложения.

У меня возникают проблемы с настройкой правильных настроек, чтобы получить поведение, которое я хочу. Прямо сейчас у меня есть ViewPager с тремя Fragment, каждый из которых состоит из RelativeLayout, содержащего ImageView (для фонового изображения) и TextView для содержимого.

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

Если я просто использую android:Theme.Holo.Light.NoActionBar.TranslucentDecor в качестве моей темы, он выглядит хорошо в портрете, но панель навигации перекрывает контент в ландшафте (см. скриншоты ниже).

First attempt - portrait. Looks good.First attempt - landscape. nav bar overlaps the content

Следуя рекомендации в документах, я добавил android:fitsSystemWindows = true в свою тему, но это создает некоторые странные артефакты (см. ниже) Second attempt - portrait. Artifacts!!Second attempt - landscape. Artifacts!!

Как я могу заставить его вести себя, как во втором примере, но хорошо выглядеть без визуальных артефактов?

4b9b3361

Ответ 1

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

Кажется, что есть ошибка Android, когда ViewPager (особенно ImageSwitcher) помещается в макет, который имеет атрибут android:fitsSystemWindows="true". По какой-то причине системные окна, похоже, получают артефакты, нарисованные над ними.:/

Во всяком случае, я нашел исправление. Для моей деятельности у меня был формат XML следующим образом:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    <!-- NOT HERE! android:fitsSystemWindows="true" -->
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageSwitcher
        android:id="@+id/background_image_switcher"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="0dp"
        android:layout_margin="0dp"
        android:background="@color/background_dark_navy"
        android:inAnimation="@android:anim/fade_in"
        android:outAnimation="@android:anim/fade_out"
        >

        <ImageView
            style="@style/BlurredBackgroundImage"
            />
        <ImageView
            style="@style/BlurredBackgroundImage"
            />

    </ImageSwitcher>

    <FrameLayout
        android:fitsSystemWindows="true" <!-- Here!!! -->
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- Fitted content here -->

    </FrameLayout>

Трюк состоял в том, чтобы не содержать ImageSwitcher в макете с атрибутом android:fitsSystemWindows="true", но вместо этого переместить атрибут android:fitsSystemWindows="true" в внутренний FrameLayout, содержащий фактическое содержимое, которое мне нужно было поместить ( текст заголовка в вашем случае). К сожалению, это позволяет видеть, что изображение ImageSwitcher/ViewPager слегка срезается системными окнами, но если изображение используется как фоновое изображение, в любом случае это не имеет большого значения и гораздо лучше компромисс, чем артефакты или поддержка всех различных размеров/стилей, которые могут иметь или не иметь отключенной навигации (например, текущий выбранный ответ).

Надеюсь, это поможет кому-то!

Ответ 2

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

res/values-v19/styles.xml (эти значения указаны в моей теме)

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

res/values-v19/bools.xml (включить полупрозрачный навигатор)

<bool name="translucentNavBar">true</bool>

res/values-land-v19/bools.xml (отключить полупрозрачную навигацию в ландшафте)

<bool name="translucentNavBar">false</bool>

res/values-sw600dp-land-v19/bools.xml (включить прозрачный nav для планшетов в ландшафте)

<bool name="translucentNavBar">true</bool>

Ответ 3

У меня возникли аналогичные проблемы, но я не использовал ViewPager, поэтому это может не сработать. Я решил, выполнив некоторую вложенность, как описал Гейб: только внутренняя ViewGroup - fitSystemWindows = "true", поэтому внешняя ViewGroup, которая отображает фон, разрешается расширять под полупрозрачными барами. Затем я также вызываю requestFitSystemWindows() при изменении ориентации. Опять же, ваш ViewPager может усложнять ситуацию, и мое решение не будет работать, но я надеюсь, что это поможет.

Ответ 4

Поместите другую ViewGroup внутри той, у которой есть изображение, и fitsSystemWindows в true

Ответ 5

Вы должны обернуть это внутри Linear Layout и установить fitsSystemWindows в true.