it-swarm.com.ru

Использование windowTranslucentStatus с CollapsingToolbarLayout

Я пытаюсь получить эффект, аналогичный тому, что видно в Google Play.

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

Это все прекрасно работает.

<Android.support.design.widget.CoordinatorLayout
    Android:id="@+id/main"
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/recyclerView"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <Android.support.design.widget.AppBarLayout
        Android:layout_height="wrap_content"
        Android:layout_width="match_parent"
        Android:background="@color/background_material_dark">
        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/collapsingToolbarLayout"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:minHeight="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
            app:statusBarScrim="#09b"
            app:contentScrim="#09f">
            <ImageView
                Android:id="@+id/img"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:src="@drawable/location_banner"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.7"
                />
            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_height="?attr/actionBarSize"
                Android:layout_width="match_parent"
                app:layout_collapseMode="pin"
                Android:fitsSystemWindows="true"
                app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"/>
        </Android.support.design.widget.CollapsingToolbarLayout>
    </Android.support.design.widget.AppBarLayout>

</Android.support.design.widget.CoordinatorLayout>

Проблема

Когда я устанавливаю windowTranslucentStatus в true. Содержимое в представлении перемещается вверх, чтобы находиться под строкой состояния, но содержимое CollapsingToolbarLayout перемещается вверх вдвое по высоте строки состояния (CollapsingToolbarLayout сохраняет правильную высоту).

Это означает, что часть верхней части изображения обрезана, и теперь панель действий отображается под строкой состояния, а не под ней. Как побочный эффект этого теперь есть отступ в нижней части CollapsingToolbarLayout той же высоты, что и строка состояния

Вот как это выглядит без windowTranslucentStatus. Все здесь работает отлично enter image description here

windowTranslucentStatus установлен в true enter image description here

Пользователь прокручивает снизу вверх по списку (не сверху) enter image description here

32
Stimsoni

Добавьте fitsSystemWindows в макет и установите значение true.

Обновление

Извините за мой неполный ответ. Вы должны добавить fitsSystemWindows = "true" в макет XML, как показано ниже.

<Android.support.design.widget.CoordinatorLayout
    Android:id="@+id/main"
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true">

    <Android.support.v7.widget.RecyclerView
        Android:id="@+id/recyclerView"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

    <Android.support.design.widget.AppBarLayout
        Android:layout_height="wrap_content"
        Android:layout_width="match_parent"
        Android:background="@color/background_material_dark"
        Android:fitsSystemWindows="true">

        <Android.support.design.widget.CollapsingToolbarLayout
            Android:id="@+id/collapsingToolbarLayout"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:minHeight="?attr/actionBarSize"
            app:layout_scrollFlags="scroll|enterAlways|enterAlwaysCollapsed"
            app:statusBarScrim="#09b"
            app:contentScrim="#09f"
            Android:fitsSystemWindows="true">

            <ImageView
                Android:id="@+id/img"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:src="@drawable/location_banner"
                app:layout_collapseMode="parallax"
                app:layout_collapseParallaxMultiplier="0.7"
                Android:fitsSystemWindows="true"/>

            <Android.support.v7.widget.Toolbar
                Android:id="@+id/toolbar"
                Android:layout_height="?attr/actionBarSize"
                Android:layout_width="match_parent"
                app:layout_collapseMode="pin"
                Android:fitsSystemWindows="true"
                app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"/>

        </Android.support.design.widget.CollapsingToolbarLayout>

    </Android.support.design.widget.AppBarLayout>

</Android.support.design.widget.CoordinatorLayout>
18
David Jin Han

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

При обновлении библиотеки дизайна до последней версии эта проблема больше не возникает.

Теперь я удалил все fitsSystemWindows = "true", кроме ImageView (поскольку это должно отображаться в строке состояния).

Я также удалил минус-отступ с панели инструментов.

Это моя тема для 21+

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="Android:windowTranslucentStatus">true</item>
    <item name="Android:windowActionBarOverlay">true</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:textColorPrimary">@Android:color/white</item>
</style>

Теперь все работает как положено

23
Stimsoni

Лучший способ добиться этого, как сказал Стимсони

Добавьте Android: fitsSystemWindows = "true" в CoordiatorLayout, AppBarLayout и ImageView.

<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/main_content"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:fitsSystemWindows="true">

<Android.support.design.widget.AppBarLayout
    Android:id="@+id/appBar"
    Android:fitsSystemWindows="true"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <Android.support.design.widget.CollapsingToolbarLayout
        Android:id="@+id/collapsing_toolbar"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        app:contentScrim="?attr/colorPrimary"
        app:layout_scrollFlags="scroll|exitUntilCollapsed|snap">

        <ImageView
            Android:id="@+id/background"
            Android:layout_width="match_parent"
            Android:layout_height="256dp"
            Android:scaleType="centerCrop"
            Android:fitsSystemWindows="true"
            app:layout_collapseMode="parallax"
            Android:alpha="0.75"
            Android:src="@drawable/foo"/>

        <Android.support.v7.widget.Toolbar
            Android:id="@+id/toolbar"
            Android:layout_width="match_parent"
            Android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_collapseMode="pin"/>
    </Android.support.design.widget.CollapsingToolbarLayout>        
</Android.support.design.widget.AppBarLayout>...
5
mparkes

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

Добавьте следующие теги в представление "Android.support.v7.Widget.Toolbar":

Android:layout_height="48dp" // Whatever the height of the toolbar you want
Android:layout_marginTop="-48dp" // Negative of the height of the toolbar
4
Henry

Расширьте CoordinatorLayout и ​​вызовите setOnApplyWindowInsetsListener в своем конструкторе для сброса значений вставки. Вот код:

public class CustomCoordinatorLayout extends CoordinatorLayout {
    public CustomCoordinatorLayout(Context context) {
        super(context);
        init();
    }

    public CustomCoordinatorLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public CustomCoordinatorLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KitKat_WATCH) {
            setOnApplyWindowInsetsListener(new OnApplyWindowInsetsListener() {
                @Override
                public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets) {
                    WindowInsets replaced = windowInsets.replaceSystemWindowInsets(0, 0, 0, 0);
                    return replaced;
                }
            });
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}
4
Enes

У меня та же проблема, но есть одна вещь, которую я знаю.

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

2
alvarlagerlof